标签:answer poj mem 题目 integer answering style case last
Input
Output
Sample Input
7
12
0
Sample Output
6
4
给定一个数N,求小于等于这个数的所有数中,所有与N互质的数的数目。题意就是欧拉函数的定义。
#include <iostream> #include <cmath> #include <cstring> using namespace std; const int MAXN = 1e5+3; int Prime[MAXN], nPrime; bool isPrime[MAXN]; void getPrime() { memset(isPrime, 1, sizeof(isPrime)); isPrime[0] = isPrime[1] = 0; nPrime = 0; for(int i = 2; i < MAXN; i++) { if(isPrime[i]) Prime[nPrime++] = i; for(int j = 0; j < nPrime && (long long)Prime[j]*i < MAXN; j++) { isPrime[Prime[j]*i] = 0; if(i%Prime[j] == 0) break; } } } int Euler(int n) { int ans = n; for(int i = 0; Prime[i]*Prime[i] <= n; i++) { if(n%Prime[i] == 0) { ans = ans - ans/Prime[i]; do { n/=Prime[i]; } while(n%Prime[i] == 0); } } if(n > 1) ans = ans - ans/n; return ans; } int main() { int N; getPrime(); while(cin >> N && N) { cout << Euler(N) << endl; } return 0; }
标签:answer poj mem 题目 integer answering style case last
原文地址:https://www.cnblogs.com/dybala21/p/9747397.html