最大公約數之和 V2(尤拉函式)
阿新 • • 發佈:2019-02-08
【題目描述】
給出一個數N,輸出小於等於N的所有數,兩兩之間的最大公約數之和。相當於求
Input
第1行:1個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 50000)
第2 - T + 1行:每行一個數N。(2 <= N <= 5000000)
Output
共T行,輸出最大公約數之和。
Input示例
3
10
100
200000
Output示例
67
13015
143295493160
【思路】
51Nod 1040
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5000005;
int phi[maxn];
ll ans[maxn];
void phi_table(int n) {
for (int i = 2; i <= n; ++i) phi[i] = 0;
phi[1] = 1;
for (int i = 2; i <= n; ++i) {
if (0 == phi[i]) {
for (int j = i; j <= n; j += i) {
if (0 == phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
}
for(int i=1;i<=n;++i){
for(int j=2;j*i<=n;++j){
ans[i*j]+=(ll)phi[j]*(ll)i;
}
}
for(int i=1;i<=n;++i) ans[i]+=ans[i-1];
}
int main(){
phi_table(maxn-1);
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
printf("%lld\n",ans[n]);
}
return 0;
}