洛谷P5495 Dirichlet 前缀和

洛谷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;
}

猜你喜欢

转载自blog.csdn.net/weixin_46975572/article/details/116940857
今日推荐