HDU 4320 Arcane Numbers 1

来源:互联网 发布:阿里云如何关闭快照 编辑:程序博客网 时间:2024/06/05 10:55

Arcane Numbers 1


题意:给出A,B(<=10^12) ,问能否将A进制下的有限小数转化为B进制下的有限小数。A进制下的小数可以表成:sum(ai*1/(A^i)),化成B进制就是要不断的乘以B,所以B^m/(A^n)必须被整除。所以我们只需要判断A中的质因子是否都在B中出现,如果在则可以转化,否则不能。

/*    author   : csuchenan    prog     : hdu 4320    algorithm: 整数分解*/#include <cstdio>#include <cstring>#include <vector>using std::vector;typedef long long LL;vector<LL> pr;// 用于存放素数vector<LL> pf;// 用于存放A的因子const int maxn = 1000000;bool prim[maxn+5];void getPrim(){    for(int i = 2; i <= maxn ; i ++){        if(!prim[i]){            pr.push_back(i) ;            for(int j = i + i; j <= maxn; j +=i){                prim[j] = true;            }        }    }}bool solve(LL a, LL b){    //getFactors    pf.clear();    for(int i = 0; (LL)pr[i]*pr[i] <= a && i != pr.size(); i ++){        if(a%pr[i]==0){            pf.push_back(pr[i]);            while(a%pr[i]==0){                a = a/pr[i];            }        }    }    if(a > 1)        pf.push_back(a) ;    for(int i = 0; i != pf.size(); i ++){        if(b%pf[i] != 0)            return false;    }    return true;}int main(){    int T, cas=1;    LL A, B;//    freopen("test.in", "r", stdin);    getPrim();    scanf("%d", &T);    while(T--){        scanf("%I64d%I64d", &A, &B);        printf("Case #%d: ", cas ++);        if(B%A==0 || solve(A, B)){            puts("YES");        }        else{            puts("NO");        }    }    return 0;}



原创粉丝点击