题意:
如题所求和
思路:
暴力是肯定会TLE的,这道题只能是找规律,先打一个表,再oeis一下,发现n和n-1项的差符合欧拉函数线性筛
代码:
#include <cmath>
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 40000006;
bool check[MAXN+10];
int fac[MAXN];
int phi[MAXN+10];
int prime[MAXN+10];
int tot;//素数的个数
void phi_and_prime_table(int N){
memset(check,false,sizeof(check));
phi[1] = 1;
tot = 0;
for(int i = 2; i <= N; i++){
if( !check[i] ){
prime[tot++] = i;
phi[i] = i-1;
}
for(int j = 0; j < tot; 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);
}
}
}
}
long long fac1[20000005];
void init()
{
fac1[1]=0;
for(int i=2;i<20000005;i++){
fac1[i]=fac1[i-1]+phi[i*2]/2;
}
}
int main()
{
phi_and_prime_table(MAXN-2);
int t;
init();
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
printf("%lld\n",fac1[n]);
}
}