GCD Again

GCD Again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 193    Accepted Submission(s): 112
 
Problem Description
Do you have spent some time to think and try to solve those unsolved problem after one ACM contest? No? Oh, you must do this when you want to become a "Big Cattle". Now you will find that this problem is so familiar: The greatest common divisor GCD (a, b) of two positive integers a and b, sometimes written (a, b), is the largest divisor common to a and b. For example, (1, 2) =1, (12, 18) =6. (a, b) can be easily found by the Euclidean algorithm. Now I am considering a little more difficult problem: Given an integer N, please count the number of the integers M (0<M<N) which satisfies (N,M)>1. This is a simple version of problem 「GCD」 which you have done in a contest recently,so I name this problem 「GCD Again」.If you cannot solve it still,please take a good think about your method of study. Good Luck!
 
Input
Input contains multiple test cases. Each test case contains an integers N (1<N<100000000). A test case containing 0 terminates the input and this test case is not to be processed.
 
Output
            For each integers N you should output the number of integers M in one line, and with one line of output for each line in input.
 
Sample Input
2
4
0
 
Sample Output
0
1
 
Author
lcy
 
Source
2007省賽集訓隊練習賽(10)_以此感謝DOOMIII
 
Recommend
lcy

 

/*
題意:給出你一個數n,而後讓你求出比n小的,而且不與n互質的數的個數

初步思路:歐拉函數,用n減去歐拉函數-1
*/
#include<bits/stdc++.h>
using namespace std;
/**************************歐拉函數模板*****************************/
int euler(int n){
    int cur=n,i;
    for(i=2;i*i<=n;i++){
        /*
        怎麼樣保證每個能被n整除的數都是素因子吶,比當前i大的數,確定能找到一個素數,相乘等於n
        那麼只須要每找到一個素數就把n中全部能和這個素數相乘等於n的數所有去除掉,那麼這樣就能知足
        要求了。
        */
        if(n%i==0){
            cur=cur-cur/i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1) cur=cur-cur/n;
    return cur;
}
/**************************歐拉函數模板*****************************/
int n;
int main(){
    // freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF&&n){
        printf("%d\n",n-euler(n)-1);
    }
    return 0;
}
相關文章
相關標籤/搜索