您的位置:首页 > 其它

bzoj 2818 Gcd 莫比乌斯反演

2016-10-24 13:29 387 查看
莫比乌斯反演

(其实这题求一下phi就行了。。。)

#include <bits/stdc++.h>
using namespace std;
#define N 11000000
#define ll long long
bool ip
;
int prime
,mu
,cnt,n;
ll ans;
void init(int x)
{
mu[1]=1;
for(int i=2;i<=x;i++)
{
if(!ip[i])prime[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&prime[j]*i<=x;j++)
{
ip[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[i*prime[j]]=-mu[i];
}
}
}
ll get(int x)
{
ll ret=0;
for(int i=1,last=1;i<=x;i=last+1)
{
last=x/(x/i);
ret+=(ll)(x/i)*(x/i)*(mu[last]-mu[i-1]);
}
return ret;
}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d",&n);
init(n);
for(int i=1;i<=n;i++)mu[i]+=mu[i-1];
for(int i=1,j;i<=cnt;)
{
for(j=i;j<=cnt&&n/prime[j]==n/prime[i];j++);j--;
ans+=get(n/prime[i])*(j-i+1);
i=j+1;
}
printf("%lld\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: