Relatives(容斥)
Relatives
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 15708 | Accepted: 7966 |
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
Source
题解:通过这道题了解到了欧拉函数
欧拉函数可以求出小于n的质因数,则这题可以通过公式φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。来求解。例如:
12=2*2*3
那么φ(12)=12*(1-1/2)*(1-1/3)=4)
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int ans; 6 7 void solve(int x) 8 { 9 ans = x; 10 int ant = 0; 11 for(int i = 2; i*i < x; i++) 12 { 13 if(x%i == 0) 14 { 15 ans = ans / i * (i - 1); 16 } 17 while(x%i == 0) x /= i; 18 } 19 20 if(x > 1) 21 ans = ans/x*(x-1); 22 } 23 24 int main() 25 { 26 int n; 27 while(1) 28 { 29 cin >> n; 30 if(n == 0) 31 break; 32 solve(n); 33 cout << ans << endl; 34 } 35 36 37 return 0; 38 }
永远渴望,大智若愚(stay hungry, stay foolish)