http://acm.hdu.edu.cn/showproblem.php?pid=4320
题意:
给出A,B,判断在A进制下的有限小数能否转换成B进制下的有限小数。
思路:
这位博主讲得挺不错的http://blog.csdn.net/dgq8211/article/details/7971960。
我就直接引用了吧。。。
显然若 n 为整数,一定可以,那么我们下面分析一下 n 含小数的情况。
设 n 的小数部分为 x,且小数部分共 k 位,第 i 位上的数字为 ai。
那么我们可以将 x 表示成下面式子的形式:
。
而在进制转化中,整数部分是“除基倒取余”,小数部分是“乘基正取整”,且乘到小数部分为0时截止。
于是问题转化成了 x 在什么时候小数部分“乘基”一定会变成0。
由 x 的表达式我们可知,当且仅当乘数中含有 p^k 这个因子时,x 的小数部分才为0。
那么就相当于判断 q^h 中是否含有 p^k 这个因子(h 可无限大)。
又由算术基本定理,p^k 中的质因子一定和 p 中的相同。
所以只要 q 中包含 p 的所有质因子,就必定存在 h 使得 q^h 中包含 p^k 这个因子,从而使问题有解。
那么,如何判断 q 中是否包含 p 的所有质因子呢?
1、若 p 和 q 不互质,则只需要判断 q 中是否包含 p/gcd(p,q) 的所有质因子。
2、若 p 和 q 互质,当且仅当 p = 1 时,q 中包含 p 的所有质因子。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 6 ll gcd(ll a, ll b) 7 { 8 return b==0?a:gcd(b,a%b); 9 } 10 11 int main() 12 { 13 //freopen("in.txt","r",stdin); 14 int T; 15 int kase = 0; 16 scanf("%d",&T); 17 while(T--) 18 { 19 ll a,b,t; 20 scanf("%lld%lld",&a,&b); 21 while((t=gcd(a,b))!=1) a/=t; 22 printf("Case #%d: ",++kase); 23 if(a==1) puts("YES"); 24 else puts("NO"); 25 } 26 return 0; 27 }