我刚开始用的是没有优化的欧拉函数板子(超时~~~~~)下面我给附上板子
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;
}