__stdcall给了你n个点,第i个点有权值x[i],对于两个点u和v,若是x[u] xor x[v]的结果在二进制表示下有奇数个1,那么在u和v之间链接一个Edge,如今__stdcall想让你求出一共有多少个Edge。c++
若是你没能成功完成任务,那么__stdcall会让你痛苦一下,你这个测试点就没分了。浏览器
因为不当心看到这道题,而后一点儿思路都枚举,果断看了题解测试
发现了这么一句话(此题关键):优化
规律:当两个数的二进制数$1$的个数为一奇一偶时,他们抑或的值的二进制数的个数才为偶数,不然为奇数spa
那么答案显然是奇数个数乘以偶数个数code
可是暴力统计时间复杂度为$O(nlogV)$,只能够经过$\%50$的数据blog
$bitset$貌似是优化了这个过程,$bitset.count()$STL中表示这个$bitset$的$1$的个数get
#include<bits/stdc++.h> #define LL long long #define N 10000005 using namespace std; LL n,a,b,c,d,x[N],sum[2]; int main() { scanf("%lld%lld%lld%lld%lld%lld",&n,&a,&b,&c,&d,&x[0]); for(int i=1;i<=n;i++){ x[i]=((a*x[i-1]%d*x[i-1]%d)%d+(b%d*x[i-1]%d)%d+c%d)%d; x[i]=(x[i]%d+d)%d; } for(int i=1;i<=n;i++){ bitset<100>p=x[i]; sum[p.count()&1]++; } printf("%lld\n",sum[1]*sum[0]); return 0; }