bzoj 2818(欧拉函数)

来源:互联网 发布:怎么看自己的淘宝联盟i 编辑:程序博客网 时间:2024/04/26 23:47

传送门
题解:
1.莫比乌斯反演,又慢又麻烦,拒绝
2.欧拉函数性质,外层枚举n以内的质数d,内层求n/d范围内互质的数对,这一步可以通过预处理欧拉函数前缀和实现,注意数对是有序的,但是(1,1)要去重。

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN=1e7+2;int n,phi[MAXN],prime[MAXN/10],tot=0;bool vis[MAXN];ll ans=0,sum[MAXN]={0};inline void linear_shaker() {    phi[1]=1;    memset(vis,false,sizeof(vis));    for (register int i=2;i<=n;++i) {        if (!vis[i]) prime[++tot]=i,phi[i]=i-1;        for (int j=1;j<=tot&&i*prime[j]<=n;++j) {            vis[i*prime[j]]=true;            if (i%prime[j]==0) {phi[i*prime[j]]=phi[i]*prime[j];break;}            phi[i*prime[j]]=phi[i]*(prime[j]-1);        }    }    for (register int i=1;i<=n;++i) sum[i]=sum[i-1]+phi[i];}int main() {    scanf("%d",&n);    linear_shaker();    for (register int i=1;i<=tot;++i)        ans+=(sum[n/prime[i]]<<1)-1;    printf("%lld\n",ans);    return 0;}
原创粉丝点击