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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值