http://acm.hdu.edu.cn/showproblem.php?pid=6434
仔细观察内循环,
n和n+1的区别只在n+1多一个1~n的循环而已。
打表发现内循环的规律
对于一个i 如果phi(i)是偶数则取偶数,如果是奇数则取一半
#include<bits/stdc++.h>
using namespace std;
const int N = 2e7+10 ;
long long phi[N], prime[N];
long long ans[N];
long long tot;//tot计数,表示prime[N]中有多少质数
void Euler(){
phi[1] = 1;
for(long long i = 2; i < N; i ++){
if(!phi[i]){
phi[i] = i-1;
prime[tot ++] = i;
}
for(long long j = 0; j < tot && 1ll*i*prime[j] < N; j ++){
if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j]-1);
else{
phi[i * prime[j] ] = phi[i] * prime[j];
break;
}
}
}
}
int main(){
Euler();
ans[0]=0;
ans[1]=0;
ans[2]=1;
for(int i=3;i<=20000000;i++)
{
if(i%2==1)
{
ans[i]=ans[i-1]+phi[i]/2;
}
else
{
ans[i]=ans[i-1]+phi[i];
}
}
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
//cout<<phi[n]<<endl;
printf("%lld\n",ans[n]);
}
}