luogu4932 浏览器 (拆)

分析1的个数的奇偶性:

奇xor奇=偶xor偶=偶

奇xor偶=奇

所以只要统计1的个数是奇数的数的个数 和 是偶数的个数 乘一起就行了

直接用bitset来做,虽然常数很小/数据随机可以过,但复杂度是$O(nlogv)$的

其实可以把一个数拆成前16位和后16位,先预处理出来$2^{16}$个数的奇偶性,然后可以O(1)查

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=1e5;
 7 
 8 inline ll rd(){
 9     ll x=0;char c=getchar();int neg=1;
10     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
11     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
12     return x*neg;
13 }
14 
15 ll n,a,b,c,d,x;
16 ll cnt[maxn],num[2];
17 
18 int main(){
19     //freopen("","r",stdin);
20     int i,j,k;
21     // for(i=1;i<(1<<16);i++) {cnt[i]=bitset<64>(i).count();}
22     n=rd(),a=rd(),b=rd(),c=rd(),d=rd(),x=rd();
23     
24     for(i=1;i<=n;i++){
25         x=(a*x%d*x+b*x%d+c)%d;
26         // printf("%lld %lld\n",x,x>>16);
27         num[bitset<32>(x).count()&1]++;
28         // num[(cnt[x>>16]+cnt[x%(1<<16)])&1]++;
29     }
30     printf("%lld\n",num[0]*num[1]);
31     return 0;
32 }

 

posted @ 2018-10-22 22:14  Ressed  阅读(165)  评论(0编辑  收藏  举报