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



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