POJ 2407-Relatives (欧拉函数)

来源:互联网 发布:广州淘宝培训汇学好 编辑:程序博客网 时间:2024/06/07 09:03
Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 4   Accepted Submission(s) : 4
Problem 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
7120
 

Sample Output
64
 
求小于等于n且与n互质的数
定理:
设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理,A*B和C可建立一一对应的关系。因此φ(n)的值使用算术基本定理便知,
 
 
例如
 
与欧拉定理、费马小定理的关系
对任何两个互质的正整数a, m(m>=2)有
即欧拉定理
当m是质数p时,此式则为:
即费马小定理。
代码按照定理来写的(不能用线性筛因为复杂度1e9

#include <iostream>#include <string>#include <string.h>#include <algorithm>#include <cmath>#include <vector>#include <stdio.h>#include <stack>using namespace std;int eular(int num) {    int ans = 1;    for (int i = 2;  i * i <= num; ++i) {        if (num % i == 0) {            num /= i;            ans *= i - 1;            while (num % i == 0) {                num /= i;                ans *= i;            }        }    }    if (num > 1)        ans *= (num - 1);    return ans;}int main() {        //freopen("1.txt", "r", stdin);    int n;    while (cin >> n && n) {        cout << eular(n) << endl;    }}


原创粉丝点击