• 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
    ",x,x>>16);
    27         num[bitset<32>(x).count()&1]++;
    28         // num[(cnt[x>>16]+cnt[x%(1<<16)])&1]++;
    29     }
    30     printf("%lld
    ",num[0]*num[1]);
    31     return 0;
    32 }
  • 相关阅读:
    Python-Basis-9th
    Python-Basis-8th
    Python-Basis-7th
    Ubuntu-Basis-4th
    Ubuntu-Basis-3rd
    Ubuntu-Basis-2nd
    Ubuntu-Basis-1st
    疯狂java第五章&&第六章-面向对象
    疯狂java第四章-流程控制与数组
    疯狂java第三章-数据类型和运算符
  • 原文地址:https://www.cnblogs.com/Ressed/p/9833490.html
Copyright © 2020-2023  润新知