__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; }