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.
For each question, in a separate line, print Finite if the fraction is finite and Infinite otherwise.
2 6 12 10 4 3 10
Finite Infinite
4 1 1 2 9 36 2 4 12 3 3 5 4
Finite Finite Finite Infinite
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
首先恭喜杨哥哥在这次比赛中蓝名!!!,虽说有点(非常)妒忌,但是我也很开心,有人陪我打CF,还有人教我,
让我从黑名一步一步走出来,希望下一次就绿名。。。
题意:p/q 在b进制是否是一个 有限小数。
题解:这个题目有意思,
在杨哥哥的教导下,他说,首先对 分子分母约分,然后 再不断地对 b和q /gcd(b,q);
主要看 q==1 证明有限,反之就说明 无限。
但是这样很很容易超时, 所以 b不断减少,减少它们间的差距来达到 优化。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define gcd __gcd //350(杨哥哥过的时间)
/*inline ll gcd(ll a,ll b){ //390
while(b^=a^=b^=a%=b);
return a;
}*/
/*inline ll gcd(ll a,ll b){ //420
return a%b==0?b:gcd(b,a%b);
}*/
/*inline ll gcd(ll x,ll y){ //620
ll i,j;
if(x==0)return y;
if(y==0)return x;
for(i=0;0==(x&1);i++)x>>=1;
for(j=0;0==(y&1);j++)y>>=1;
if(j<i)i=j;
while(1){
if(x<y)x^=y,y^=x,x^=y;
if(0==(x-=y))return y<<i;
while(0==(x&1))x>>=1;
}
}*/
int main()
{
ll T,p,q,b;
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&p,&q,&b);
ll t=gcd(p,q);
q/=t;
t=b;
while(q!=1){
t=gcd(q,t);
q/=t;
if(t==1)break;
}
if(q==1){
printf("Finite\n");
}else{
printf("Infinite\n");
}
}
return 0;
}