NC16734. 异或和
描述
输入描述
第一行读入两个整数 n,m (n,m <= 2000)
接下来n行,每行读入一个长度为m的01字符串。
输出描述
输出一个整数表示答案模 109+7
示例1
输入:
1 3 101
输出:
1
说明:
小A出现在(1,1)的时候期望曼哈顿距离是1C++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; }