C. Finite or not? Codeforces Round #483 (Div. 2)
You are given several queries. Each query consists of three integers pp, qq and bb. You need to answer whether the result of p/qp/q in notation with base bb is a finite fraction.
A fraction in notation with base bb is finite if it contains finite number of numerals after the decimal point. It is also possible that a fraction has zero numerals after the decimal point.
The first line contains a single integer nn (1≤n≤1051≤n≤105) — the number of queries.
Next nn lines contain queries, one per line. Each line contains three integers pp, qq, and bb (0≤p≤10180≤p≤1018, 1≤q≤10181≤q≤1018, 2≤b≤10182≤b≤1018). All numbers are given in notation with base 1010.
OutputFor each question, in a separate line, print Finite
2 6 12 10 4 3 10outputCopy
Finite InfiniteinputCopy
4 1 1 2 9 36 2 4 12 3 3 5 4outputCopy
Finite Finite Finite InfiniteNote
612=12=0,510612=12=0,510
43=1,(3)1043=1,(3)10
936=14=0,012936=14=0,012
412=13=0,13
這個題首先得掌握下十進位制小數如何化為二進位制小數的思想
首先如果p是0,那麼肯定就是有限的,然後對於p/q可以先對分子分母約分一下,只需要關心1/q是否可以在b進位制下被有限
表示即可,因為他倆之間只差了個係數p,也就是說1/q可以被有限表示,那麼p/q一定可以被有限表示。
考慮1/q,一定是一個小於等於1的數,考慮吧小數轉化為b進位制的過程,在上篇部落格中已經提到過。最後總結下,就是
如果存在(b^i)(modq)=0,那麼就證明可以轉化為一個b進位制下的有限小數,於是我們判斷是否存在這個i即可。
還有一種性質,在十進位制如果p/q是分數的最簡形式。那麼p/q能化成有限小數。當且僅當q的質因數分解形式中只有質因子2和5
(且不能出現其他質因子)(也就是說q的質因子只能出現10的質因子裡面出現過的因為只有這樣分母才能化成10^n的形式。才能化成小數。)
因此。對於在b進位制下的小數p/q只要看看q的質因子是不是都是b的質因子就可以了。用gcd來做。每次都用q去除gcd(q,b)
這樣。如果最後q能夠變成1.那就說明q的質因子都是b的質因子。
程式碼如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL gcd(LL temp1,LL temp2)
{
LL minn=temp1,maxn=temp2;
if(temp1>temp2){
swap(minn,maxn);
}
return minn==0?maxn:gcd(maxn%minn,minn);
}
int main()
{
int n;
scanf("%d",&n);
while(n--){
LL p,q,b;
scanf("%I64d%I64d%I64d",&p,&q,&b);
if(p==0){
printf("Finite\n");
}else{
LL ans=gcd(p,q);
p/=ans;
q/=ans;
if(q==1){
printf("Finite\n");
}else{
LL res;
while(res=gcd(q,b)>1){
LL temp=gcd(q,b);
while(q%temp==0){//必須進行優化
q/=temp;
}
}
if(q==1){
printf("Finite\n");
}else{
printf("Infinite\n");
}
}
}
}
return 0;
}