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 }