HDU 4320 Arcane Numbers 1

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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章