洛谷P5495 Dirichlet 前缀和
TITLE
思路
∵ 质 数 唯 一 分 解 \because 质数唯一分解 ∵质数唯一分解
∴ 每 个 数 对 倍 数 产 生 贡 献 \therefore 每个数对倍数产生贡献 ∴每个数对倍数产生贡献
先线性筛出质数
从小到大计算 每个数对倍数产生贡献
贡献累加
CODE
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=20000000;
unsigned int seed,a[maxn+10],b[maxn+10],z[maxn+10];
inline unsigned int getnext()
{
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
int main()
{
unsigned int n,i,j,tot=0,ans;
scanf("%u%u",&n,&seed);
for(i=1;i<=n;i++)a[i]=getnext();
for(b[1]=1,i=2;i<=maxn;i++)
{
if(!b[i])z[tot++]=i;
for(j=0;j<tot&&i*z[j]<=maxn;j++)
{
b[i*z[j]]=1;
if(!(i%z[j]))break;
}
}
for(i=0;i<tot;i++)
for(j=1;j*z[i]<=n;j++)
a[z[i]*j]+=a[j];
for(ans=0,i=1;i<=n;i++)ans^=a[i];
printf("%u",ans);
return 0;
}