【POJ2407】Relatives——欧拉数

Relatives

Time Limit: 1000MS Memory Limit: 65536K

Description

Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.
Input

There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.
Output

For each test case there should be single line of output answering the question posed above.
Sample Input

7
12
0
Sample Output

6
4

题意:求与n互质m的个数 2mn1 .
分析:很裸的题意,求解n欧拉数。
φ(n)=n(11p1)(11p2)(11p3)(11pk)

#include <cstdio>
#include <cmath>
#include <iostream>

using namespace std;

typedef long long LL;

int Phi(int n)//用整数拆分的形式在log(n)的时间内求出欧拉数.
{
    int m = (int)sqrt(n+0.5);

    int ans  = n ;

    for(int i = 2;i<=m;i++)
    {
        if(n % i == 0)
        {
            ans  = ans/i*(i-1);

            while(n % i == 0)
            {
                n/=i;
            }
        }
    }

    if(n>1)
    {
        ans = ans/n*(n-1);
    }

    return ans;
}

int main()
{

    int n;

    while(~scanf("%d",&n)&&n)
    {
        printf("%d\n",Phi(n));
    }
    return 0;
}

你可能感兴趣的:(【POJ2407】Relatives——欧拉数)