POJ 2407 Relatives
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)。
其实就是调用欧拉函数的公式。
这里简单说一下欧拉函数。
欧拉函数是数论中的一个经典内容,其中φ(n)表示小于等于n的所有与n互质的数的个数。注意是个数。
有三个极其重要的结论:
φ(1)=1;
φ(a)(a为质数)=a-1;
φ(a^p)(a为质数)=a^p-a^(p-1)=(a-1)*(a^(p-1));(容斥原理)
然后就能推导出一个公式,大体长这个样子:
φ(n)=n*∏(1-1/ai)。
剩下的工作就是模拟了(然鹅蒟蒻并不会)
不过还是搞到了大佬的代码,勉勉强强地看懂了:
#include<cstdio> using namespace std; int euler(long long n) { int temp = n; for( int i = 2;i <= n;i++) { if( n % i == 0) { temp -= temp / i; while( n % i == 0) n /= i; } } return temp; } int main() { long long n; long long cnt; while(scanf("%lld",&n) && n) { cnt=0; cnt=euler(n); printf("%lld\n",cnt); } return 0 ; }