您的位置:首页 > 其它

HDU 4320 Arcane Numbers 1

2012-10-19 11:47 417 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: