码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉函数 - HDU1286

时间:2015-08-08 22:41:33      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

欧拉函数的作用:

有[1,2.....n]这样一个集合,f(n)=这个集合中与n互质的元素的个数。欧拉函数描述了一些列与这个f(n)有关的一些性质,如下:

1、令p为一个素数,n = p ^ k,则   f(n) = p ^ k - p ^ (k-1)

2、令m,n都是素数,则   f(m*n) = f(m) * f(n)

3、如果n为奇数,则    f(2 * n) = f(n)

 

下面给出一个例题的代码,例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1286

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <string>
 7 #include <cmath>
 8 using namespace std;
 9 const int maxn = 32769;
10 
11 int ans[maxn],prim[4000],flag_p[maxn];
12 /*
13 把1~maxn所有的素数打出来 
14 */
15 int SolPrim()
16 {
17     memset(flag_p,0,sizeof(flag_p));
18     for(int i = 2;i < sqrt((double)maxn);++i)
19         for(int j = i * i;j < maxn;j += i)
20             flag_p[j] = 1;
21     int  f = 0;
22     for(int i = 2;i < maxn;++i)
23         if(!flag_p[i])
24             prim[f++] = i;
25 }
26 /*
27 打表,把结果全部打出来 
28 */
29 void PreSol()
30 {
31     int f = SolPrim();
32     memset(ans,0,sizeof(ans));
33     for(int i = 1;i < 32768;++i)
34     {
35         int temp = 1,t = i;
36         for(int j = 0;prim[j] <= i;++j)
37         {
38             int tt =  0;
39             while(t % prim[j] == 0)
40             {
41                 t /= prim[j];
42                 tt++;
43             }
44             if(tt) temp *= (pow(prim[j],tt-1) * (prim[j] - 1));
45         }
46         ans[i] = temp;
47     }
48 }
49 
50 int main()
51 {
52     PreSol();
53     int T,n;
54     scanf("%d",&T);
55     while(T--)
56     {
57         scanf("%d",&n);
58         printf("%d\n",ans[n]);
59     }
60     return 0;
61 }
View Code

 

欧拉函数 - HDU1286

标签:

原文地址:http://www.cnblogs.com/xiaxiaosheng/p/4713977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!