1. 程式人生 > >[bzoj 2818]歐拉函數

[bzoj 2818]歐拉函數

rep nbsp 題目 ble long logs style size esp

題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818

枚舉最大公約數,對於每一個質數p,只需要求出1<=x,y<=(n/p)範圍內gcd(x,y)=1的對數,而這個對數就是類似歐拉函數的一個前綴和。

#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=10000005;
bool check[maxn];
int prime[maxn];
long long phi[maxn];
long long prephi[maxn];

void getPrime() { int N=10000000; memset(check,false,sizeof(check)); prime[0]=0; phi[1]=1; for (int i=2;i<=N;i++) { if (!check[i]) { prime[++prime[0]]=i; phi[i]=i-1; } for (int j=1;j<=prime[0];j++) { if (i*prime[j]>N) break
; check[i*prime[j]]=true; if (i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } else { phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } prephi[1]=phi[1
]; for (int i=2;i<=N;i++) prephi[i]=prephi[i-1]+2ll*phi[i]; } int main() { getPrime(); int n; scanf("%d",&n); long long ans=0; for (int i=1;i<=prime[0];i++) { if (prime[i]>n) break; int r=n/prime[i]; ans+=prephi[r]; } printf("%lld\n",ans); return 0; }

[bzoj 2818]歐拉函數