我刚开始用的是没有优化的欧拉函数板子(超时~~~~~)下面我给附上板子
ll eular(int x) { ll ret=1,i; for(i=2; i*i<=x; i++) { if(x%i==0) { x/=i; ret*=i-1; while(x%i==0) { x/=i; ret*=i; } } } if(x>1) ret*=x-1; return ret; }
//普通题可以用 但是如果卡时间很紧的话 会超时 所以我们应该去优化欧拉函数代码
接下来附上题解代码
#include<iostream> using namespace std; typedef long long ll; const ll maxv = 1000010; ll p[maxv]; ll a[maxv]; void phi() { for(ll i=2;i<maxv;i++) p[i]=0; p[1]=1; for(ll i=2;i<maxv;i++) { if(!p[i]) for(ll j=i;j<=maxv;j+=i) { if(!p[j])p[j]=j; p[j]=p[j]/i*(i-1); } } } int main() { phi(); a[1]=0; for(int i=2;i<=1000005;i++) { a[i]=a[i-1]+p[i]; } ll n; int sum=0; while(scanf("%lld",&n)!=EOF) { printf("%lld\n",a[n]*2); } return 0; }