poj 1091(容斥原理,素因子)


#include
using namespace std;
long long pow(long long m,int n){
    long long ans = 1;
    while(n--){
        ans *= m;
    }
    return ans;
}
int main(){
    int i,j,n,prime[10],tot,cnt;
    long long m,t,k,rst;
    scanf("%d%lld",&n,&m);
    t = m;
    tot = 0;
    for(i=2;i*i<=t;i++){
        if(t%i==0){
            prime[tot++] = i;
            while(t%i==0){
                t /= i;
            }
        }
    }
    if(t!=1){
        prime[tot++] = t; 
    }
    rst = pow(m,n);
    for(i=1;i<(1<){
        k = 1;
        cnt = 0;
        for(j=0;j){
            if(i&(1<<j)){
                cnt++;
                k *= prime[j];
            }
        }
        if(cnt%2==1){
            rst -= pow(m/k,n);
        }
        else{
            rst += pow(m/k,n);
        }
    }
    printf("%lld\n",rst);
    return 0;
}