题意:给了两个数p,q和一个进制数b,问p/q在b进制下是否是有限小数
分析:首先对p/q约分,将十进制分数转化为b进制数就是不断乘以b,小数点后依次加上整数部分,如果是有限小数,肯定是最后可以乘到一个数能整除q。但是对于p直接乘以b的话会爆long long 的,这里用到一个trick,就是乘以b最后能整除q的话,其实就看每次乘以b之后会不会产生大于1的b与q的公约数,q的因子就不断被约掉了,直到公约数为1为止。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
if(b == 0)return a;
else return gcd(b,a % b);
}
int main()
{
ll n,p,q,b;
cin>>n;
for(int i = 1; i <= n; i++)
{
scanf("%I64d%I64d%I64d",&p,&q,&b);
ll x = gcd(p,q);
q /= x;
while(q != 1)
{
ll s = gcd(q,b);
if(s == 1)break;
while(q % s == 0)
q /= s;
}
if(q == 1)printf("Finite\n");
else printf("Infinite\n");
}
return 0;
}