Wannafly挑战赛18C 异或和

傻逼题,和期望没毛关系。。。

分开xy坐标,n方直接统计每个坐标的曼蛤顿距离即可。。

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
#define mod 1000000007
il int gi(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
	return x*f;
}
char s[2010][2010];
int n,m,ans,sx[2010],sy[2010];
ll SX[2010],SY[2010],inv,xx,yy;
int main(){
#ifndef ONLINE_JUDGE
	freopen("129c.in","r",stdin);
	freopen("129c.out","w",stdout);
#endif
	n=gi(),m=gi();
	for(int i=1;i<=n;++i)scanf("%s",s[i]+1);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(s[i][j]=='1')
				++sx[i],++sy[j],++xx;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j)
			SX[i]+=sx[j]*abs(i-j);
		SX[i]%=mod;
	}
	for(int i=1;i<=m;++i){
		for(int j=1;j<=m;++j)
			SY[i]+=sy[j]*abs(i-j);
		SY[i]%=mod;
	}
	yy=mod-2;inv=1;
	while(yy){
		if(yy&1)inv=inv*xx%mod;
		xx=xx*xx%mod;yy>>=1;
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			ans^=(SX[i]+SY[j])*inv%mod;
	printf("%d
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/xzz_233/p/9737965.html