列表

详情


NC16734. 异或和

描述

有一个n*m的网格图,给出小B出现在每个位置的可能性,用一个n*m的01矩阵表示,小B等概率出现在所有1的位置。求小A在每个位置上与小B期望曼哈顿距离的异或和,先把期望取模之后再异或

输入描述

第一行读入两个整数 n,m (n,m <= 2000)
接下来n行,每行读入一个长度为m的01字符串。

输出描述

输出一个整数表示答案模 109+7

示例1

输入:

1 3
101

输出:

1

说明:

小A出现在(1,1)的时候期望曼哈顿距离是1
小A出现在(1,2)的时候期望曼哈顿距离是1
小A出现在(1,3)的时候期望曼哈顿距离是1
答案是这三者的异或和。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 77ms, 内存消耗: 504K, 提交时间: 2019-11-10 09:25:54

#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(int i=x;i<=y;++i)

const int N=2000+10,mod=1e9+7;
int n,m,numh[N],numl[N],h[N],l[N],tot,inv,as;
char ch[N];

int power(int x,int y){int ret=1;while(y){if(y&1)ret=1ll*ret*x%mod;x=1ll*x*x%mod;y>>=1;}return ret;}

int main()
{
	scanf("%d%d",&n,&m);rp(i,1,n){scanf("%s",ch+1);rp(j,1,m)numh[i]+=ch[j]^'0',numl[j]+=ch[j]^'0',tot+=ch[j]^'0';}inv=power(tot,mod-2);
	rp(i,1,n)rp(j,1,n)(h[i]+=1ll*numh[j]*abs(i-j)%mod)%=mod;rp(i,1,m)rp(j,1,m)(l[i]+=1ll*numl[j]*abs(i-j)%mod)%=mod;
	rp(i,1,n)rp(j,1,m)as^=(1ll*h[i]*inv%mod+1ll*l[j]*inv%mod)%mod;printf("%d\n",as);
	return 0;
}

上一题