bk = sum of ai if i | k
维护一个质因子分解之后,关于指数的前缀和。
理论时间复杂度O(nloglogn)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#define ll long long
#define llu unsigned ll
using namespace std;
#define uint unsigned int
uint seed;
inline uint getnext(){
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
const int maxn=20000100;
int prime[maxn],cnt=0,n;
bool ha[maxn];
uint a[maxn];
void Prime(void)
{
ha[1]=true;
for(int i=2;i<=n;i++)
{
if(!ha[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=n;j++)
{
ha[prime[j]*i]=true;
if(i%prime[j]==0) break;
}
}
}
int main(void)
{
scanf("%d%u",&n,&seed);
Prime();
for(int i=1;i<=n;i++)
a[i]=getnext();
for(int i=1;i<=cnt;i++)
for(int j=1;j*prime[i]<=n;j++)
a[j*prime[i]]+=a[j];
uint ans=0;
for(int i=1;i<=n;i++)
ans^=a[i];
printf("%u\n",ans);
return 0;
}