題意:給出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;
}