1. 程式人生 > >HDU 4320 Arcane Numbers 1(質因子包含)

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

sin puts src 無限 stream names 算術基本定理 ane 分析

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(質因子包含)