HDU1286-找新朋友(欧拉函数)

来源:互联网 发布:如何建设网络强国800字 编辑:程序博客网 时间:2024/04/28 23:24

Problem Description

新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。

Input

第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。

Output

对于每一个N,输出一行新朋友的人数,这样共有CN行输出。

Sample Input

2
25608
24027

Sample Output

7680
16016


代码一:

/* *定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质的数的数目。 *    例如:φ(8)=4,因为1357均和8互质。 *性质:1.若p是质数,φ(p)= p-1. *   2.若n是质数p的k次幂,φ(n)=(p-1)*p^(k-1)。因为除了p的倍数都与n互质 *   3.欧拉函数是积性函数,若m,n互质,φ(mn)= φ(m)φ(n). *  根据这3条性质我们就可以推出一个整数的欧拉函数的公式。因为一个数总可以写成一些质数的乘积的形式。 *  E(k)=(p1-1)(p2-1)...(pi-1)*(p1^(a1-1))(p2^(a2-1))...(pi^(ai-1)) *    = k*(p1-1)(p2-1)...(pi-1)/(p1*p2*...*pi) *    = k*(1-1/p1)*(1-1/p2)...(1-1/pk) *在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因数) *  若( N%a ==0&&(N/a)%a ==0)则有:E(N)= E(N/a)*a; *  若( N%a ==0&&(N/a)%a !=0)则有:E(N)= E(N/a)*(a-1); */#include <iostream>#include <iomanip>#include <cstdio>#include <cstdlib>#include <string>#include <cstring>#include <cmath>#include <algorithm>#define N 100010using namespace std;int num[40000];int Eular(int x){    int ans = 1;    for(int i = 2; i*i <= x; i++)    {        if(x%i == 0)        {            x /= i;            ans *= i - 1;            while(x%i == 0)            {                x /= i;                ans *= i;            }        }    }    if(x > 1)        ans *= x - 1;    return ans;}int main(){#ifndef ONLINE_JUDGE    freopen("1.txt", "r", stdin);#endif    int t,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        printf("%d\n",Eular(n));    }    return 0;}

代码二:

#include <iostream>#include <iomanip>#include <cstdio>#include <cstdlib>#include <string>#include <cstring>#include <cmath>#include <algorithm>#define N 100010using namespace std;int num[40000];int main(){#ifndef ONLINE_JUDGE    freopen("1.txt", "r", stdin);#endif    int cn, n, i, m, ans, j;    cin >> cn;    while(cn--)    {        ans = 0;        cin >> n;        memset(num, 0, sizeof(num));        for (i =2; i <= n; i++)        {            if(n%i == 0)            {                for (j = i; j <= n; j+=i)                    num[j] = 1;            }        }        for (i = 1; i <= n; i++)        {            ans += num[i];        }        cout << n-ans << endl;    }    return 0;}
0 0
原创粉丝点击