CDOJ--1141

原题链接:http://acm.uestc.edu.cn/problem.php?pid=1141

分析:运用欧拉函数可解此题。

 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 }
View Code

 

posted @ 2013-12-10 01:23  EtheGreat  阅读(174)  评论(0编辑  收藏  举报