思路:
我们先用欧拉筛筛出所有质数,然后枚举每个数的约数j(用质数来枚举),将有贡献的加进去
c o d e code code
#include<iostream>
#include<cstdio>
#include<cmath>
#define uint unsigned int
using namespace std;
uint seed;
uint n, ans;
uint prime[20000010], a[20000010], v[20000010], cnt;
inline uint getnext()
{
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
void ola()
{
for(uint i=2; i<=n; i++)
{
if(!v[i])
prime[++cnt]=i;
for(uint j=1; i*prime[j]<=n&&j<=cnt; j++)
{
v[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
cin>>n>>seed;
for(uint i=1; i<=n; i++)
a[i]=getnext();
ola();
for(uint i=1; i<=cnt; i++)
for(uint j=1; j*prime[i]<=n; j++)
a[j*prime[i]]+=a[j];
for(uint i=1; i<=n; i++)
ans^=a[i];
cout<<ans;
return 0;
}