CDOJ--1141
原题链接:http://acm.uestc.edu.cn/problem.php?pid=1141
分析:运用欧拉函数可解此题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <queue> 7 #include <string> 8 #include <stack> 9 #include <map> 10 #include <vector> 11 #define LL long long 12 using namespace std; 13 int T; 14 int n; 15 int gcd(int a,int b) 16 { 17 if(b==0)return a; 18 else return gcd(b,a%b); 19 } 20 int dp[10005]; 21 int phi[10005]; 22 int get(int n) 23 { 24 int rea=n; 25 for(int i=2;i*i<=n;i++) 26 if(n%i==0) 27 { 28 rea=rea-rea/i; 29 do 30 n/=i; 31 while(n%i==0); 32 } 33 if(n>1)rea=rea-rea/n; 34 return rea; 35 } 36 void init() 37 { 38 for(int i=1;i<=10000;i++) 39 phi[i]=get(i); 40 dp[1]=1; 41 dp[2]=3; 42 dp[3]=7; 43 for(int i=4;i<=10000;i++) 44 { 45 for(int j=1;j<i;j++) 46 dp[i]=dp[i-1]+phi[i]*2; 47 } 48 } 49 int main() 50 { 51 scanf("%d",&T); 52 init(); 53 while(T--) 54 { 55 scanf("%d",&n); 56 printf("%d\n",dp[n]); 57 } 58 return 0; 59 }