1. 程式人生 > >C. Finite or not? Codeforces Round #483 (Div. 2)

C. Finite or not? Codeforces Round #483 (Div. 2)

傳送門

You are given several queries. Each query consists of three integers ppqq 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.

Input

The first line contains a single integer nn (1n1051≤n≤105) — the number of queries.

Next nn lines contain queries, one per line. Each line contains three integers ppqq, and bb (0p10180≤p≤10181q10181≤q≤10182b10182≤b≤1018). All numbers are given in notation with base 1010.

Output

For each question, in a separate line, print Finite

 if the fraction is finite and Infinite otherwise.

ExamplesinputCopy
2
6 12 10
4 3 10
outputCopy
Finite
Infinite
inputCopy
4
1 1 2
9 36 2
4 12 3
3 5 4
outputCopy
Finite
Finite
Finite
Infinite
Note

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;
}