Codeforecs 424C Magic Formulas 规律+前缀和

来源:互联网 发布:linux ps aux 编辑:程序博客网 时间:2024/06/05 08:39

点击打开链接

^异或符号 
题意 给出n个数,n<=1e6,pi<=2e9,另qi=pi^(imod1)^(imod2)^...^(imodn) Q=q1^q2^...^qn  求Q?

异或满足交换律和消去率

 i mod k (i=1,2...n)  = 1 ^2^3..^k-1^0 ^1^2^.....k-1^0,... 

若有余数,r=n%k 总共有b=n/k+1组,

若组数为偶数,则前面每组两两异或为0 ,最后有余数一组的值为 1^2^3..^r

若组数为奇数 则前面每组两两异或为0,剩下1^...k-1 1^....r 得r+1^...k-1 用前缀和f[r]保存1~r的异或值即可 


#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e6+20;//^异或符号 //qi=pi^(imod1)^(imod2)^...^(imodn)//Q=q1^q2^...^qnll n,a[N];ll p[N];//p[i] 异或前缀 int main(){p[0]=0;for(int i=1;i<=1e6;i++)p[i]=p[i-1]^i;while(cin>>n){for(int i=1;i<=n;i++)scanf("%I64d",&a[i]);ll ans=0;//(i modk) i=1~nfor(int k=2;k<=n;k++){ll b=n/k;//能分成b组ll r=n%k;if(r==0&&b%2==0)continue;if(b%2==0)ans=ans^p[r];elseans=ans^p[r]^p[k-1];//最后两组//cout<<ans<<' ';  }for(int i=1;i<=n;i++)ans^=a[i];cout<<ans<<endl;}return 0;}


0 0
原创粉丝点击