Codeforces Round #498 (Div. 3) - F Xor-Paths (折半搜索)

本文介绍了一种计算特定矩阵中所有路径异或值等于给定目标值的方法。通过反向搜索和动态规划相结合的技术,实现了高效求解。特别关注了起点和折半搜索条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

题目

 

题意:

给你一个n*m的矩阵,从(1,1)到(n,m)只能往右或者往下走,把路径的值全部异或起来,若等于k,则算作一条路径。

问你有几条路径。

 

POINT:

反搜一半得到DP[x][y][mod]的值,代表若走到xy这个点,值为mod对答案有多少贡献。

然后正搜到xy。

折半搜索。

注意x+y/2=1的情况。

起点为(1,1) x+y=2。

 

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<map>
using namespace std;
#define  LL long long
LL mp[33][33];
map<LL,LL>dp[33][33];

LL ans=0;
LL k;

void dfs(LL x,LL y,LL now,LL n,LL m)
{
	if(x>n||y>m) return;
	if(x+y>(n+m)/2+1) return;
	if(x+y==(n+m)/2+1){
		ans+=dp[x][y][now];
		return;
	}
	dfs(x+1,y,now^mp[x+1][y],n,m);
	dfs(x,y+1,now^mp[x][y+1],n,m);
}

void ddfs(LL x,LL y,LL now,LL n,LL m)
{
	if(x<1||y<1) return;
	if(x+y<(n+m)/2+1) return;
	now=now^mp[x][y];
	if(x+y==(n+m)/2+1){
		dp[x][y][now^mp[x][y]]++;
		return;
	}
	ddfs(x-1,y,now,n,m);
	ddfs(x,y-1,now,n,m);
}

int main()
{
	LL n,m;
	scanf("%lld%lld%lld",&n,&m,&k);
	for(LL i=1;i<=n;i++){
		for(LL j=1;j<=m;j++)
			scanf("%lld",&mp[i][j]);
	}
	ddfs(n,m,k,n,m);
	dfs(1,1,mp[1][1],n,m);
	printf("%lld\n",ans);



	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值