https://www.luogu.com.cn/problem/solution/P5495
根据唯一分解定理,一个数为另一个数的约数,当且仅当它所有
质因子的指数小于另一个数对应的的质因子的指数,而这也为我们优化创造了条
件。对于一个数,用预处理好的质数去处理它所做的贡献,可以将时间复杂度,
优化至O(nloglogn)O(nloglogn),显著提高效率。
#include<bits/stdc++.h>
using namespace std;
#define uint unsigned int
uint seed;
inline uint getnext(){
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
uint num[30000000],t[30000000],prim[30000000],pri[30000000],cnt,ans;
int main()
{
uint n;
cin>>n>>seed;
for(uint i=2;i<=n;i++)
if(!prim[i])
for(uint j=2*i;j<=n;j+=i)
prim[j]=1;
for(uint i=2;i<=n;i++)
if(!prim[i]) pri[++cnt]=i;
for(uint i=1;i<=n;i++)
num[i]=getnext(),t[i]=num[i];
for(uint i=1;i<=cnt;i++)
{
for(uint j=1;pri[i]*j<=n;j++)
{
t[j*pri[i]]+=t[j];
}
}
for(uint i=1;i<=n;i++)
{
ans^=t[i];
}
cout<<ans;
}