记录编号 489659 评测结果 AAAAATTTTT
题目名称 2261.数论函数簇 最终得分 50
用户昵称 LadyLex 是否通过 未通过
代码语言 C++ 运行时间 5.027 s
提交时间 2018-03-04 15:50:41 内存使用 5.24 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define LL long long
#define mod 1005060097
#define inv2 502530049
#define RG register
inline LL gsum(LL l,LL r)
{
	LL ret=(l+r)%mod;
	ret=(r-l+1)%mod*ret%mod;
	return ret*inv2%mod;
}
inline LL calc(LL n)
{
	LL i,last,ret=0;
	for(i=1;i<=n;i=last+1)
		last=n/(n/i),ret=(ret+(n/i)%mod*gsum(i,last)%mod)%mod;
	return ret;
}
#define N 1000010
int mu[N],prime[N/5],tot,lim;
bool vis[N];
LL n;
inline void init()
{
	RG int i,j,tmp;lim=sqrt(n);
	for(mu[1]=1,i=2;i<=lim;++i)
	{
		if(!vis[i])
			prime[++tot]=i,mu[i]=mod-1;
		for(j=1;(tmp=i*prime[j])<=lim;++j)
		{
			vis[tmp]=1;
			if(i%prime[j]==0){mu[tmp]=0;break;}
			mu[tmp]=mod-mu[i];
		}
	}
}
int main()
{
	freopen("functiona.in","r",stdin);
	freopen("functiona.out","w",stdout);
	RG int ans=0;RG LL i;
	scanf("%lld",&n);
	init();
	for(i=1;i<=lim;++i)
		ans=(ans+  i*mu[i]%mod*calc(n/(i*i))%mod  )%mod;
	printf("%lld\n",(ans-gsum(1,n)+mod)%mod);
}