HDU 4320 Arcane Numbers 1(质因子包含)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4320 Arcane Numbers 1(质因子包含)相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于HDU 4320 Arcane Numbers 1(质因子包含)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3117 Fibonacci Numbers

hdu 6168 Numbers

HDU 3117 Fibonacci Numbers 数学

hdu 5181 numbers

HDU 1058 Humble Numbers

(HDU)1058 --Humble Numbers( 丑数)