洛谷——P4932 瀏覽器

P4932 瀏覽器

 

__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;
} 
相關文章
相關標籤/搜索