hdu 1286 找新朋友(欧拉函数)

解决一些数学问题时,能简化公式会省很多事~

一看这题的数据就知道有暴力会超,然后上网看了一下别人的思路,是用的欧拉公式,刚开始没弄懂,不敢写,看了书上写的推出的公式,很简单,但推理过程不甚明白,以后慢慢研究,先学会用欧拉公式吧。

欧拉φ函数:phi(n)是所有小于n的正整数里,和n互素的整数的个数。n是一个正整数。

设n=a1^x1*a2^x2*a3^x3.....*an^xn,那么n的欧拉函数就是:phi(n)=a1^(x1-1)*(a1-1)*a2^(x2-1)*(a2-1)*......an^(xn-1)*(an-1);

整理可得:phi(n)=n*(a1-1)*(a2-1)*.......(an-1)/(a1*a2*a3*.....an);

代码:

 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 int cal(int n)
5 {
6 int tem=n;
7 for(int i=2;i*i<=n;i++)
8 if(n%i==0)
9 {
10 while(!(n%i))n=n/i;
11 tem=tem/i*(i-1);
12 }
13 if(n!=1)tem=tem/n*(n-1);
14 return tem;
15 }
16 int main()
17 {
18 int t,n;
19 scanf("%d",&t);
20 while(t--)
21 {
22 scanf("%d",&n);
23 printf("%d\n",cal(n));
24 }
25 return 0;
26 }



posted @ 2011-12-22 15:08  Misty_1  阅读(168)  评论(0编辑  收藏  举报