ACM UVA-10299

質數題

//ignore header files
#define max 100000
bool is_prime[max+1];
unsigned long long prime[50000+1];
int main(int argc, char const* argv[])
{

    int m = 0;
    for(unsigned long long i = 2;i <= max;i++){
        if(!is_prime[i]){
            prime[m++] = i;
            for(unsigned long long j = i*i;j <= max ;j = j+i){
                is_prime[j] = true;
            }
        }
    }
    //printf("%llu\n",prime[0]);
    unsigned long long n;
    while (~scanf("%llu",&n) && n) {
        if(n == 1){
            printf("0\n");
            continue;
        }
        vector<int> factor;
        int tmp = n;
        for(int i = 0;i<m && prime[i]*prime[i] <= n;i++){
            if(n%prime[i] == 0){
                factor.push_back(prime[i]);
                do {
                    n = n/prime[i];
                } while (n%prime[i] == 0);
            }
        }
        if(n>1){
            factor.push_back(n);
        }
        int l = factor.size();
        int ans = tmp;
        for(int i = 0;i<l;i++){
            //printf("%lf\n",1-1.0/factor[i]);
            ans = ans/factor[i]*(factor[i]-1);
        }
        printf("%d\n",(ans));
    }

    return 0;
}