题意:
给定p,q,b,问p/q能否表示成b进制下的有限小数形式(p,q,b <= 1e18)思路:
对于约分后的p/q,只需关心1/q是否能在b进制下有限表现即可。
把1/q换成小数形式,例如1/8 = 0.125,像整数转换进制一样,小数转换进制也是不断地除以进制的基,而小数的基是b^-1。则0.125转换为二进制过程如下,0.125(除2^-1)-->余0商0.25(除2^-1)-->余0商0.5(除2^-1)-->余1商0-->停止。所以0.125的二进制形式就是0.001。所以1/q能否能在b进制下有限表现即 是否存在x使 1/q * b^x == 整数(没有小数位)即 是否存在x使q能被b^x整除。
其实最终能转化成 q中的所有质因子是否都是b中的质因子。
在十进制下一个分数是有限小数的结论是:分母的因子只有2和5
2和5正好是10的两个因子(除了1和它本身)
于是大胆猜了一发结论XD
先将p/q约分为最简形式
- 如果此时gcd(q, b) == 1,即q,b互质,则一定为无限小数
- 否则,若gcd(q, b) != 1,就让q一直除gcd(q, b),直到gcd(q, b) == 1
如果此时q==1,说明q只含有b的因子,可以转化为有限小数,反之不行。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
ll p, q, b;
int main()
{
int t;
while(~scanf("%d", &t))
{
while(t--)
{
scanf("%lld%lld%lld", &p, &q, &b);
ll gcd = __gcd(p, q);
q /= gcd;
while(q != 1)
{
gcd = __gcd(q, b);
if(gcd == 1) break;
while(q%gcd == 0) q /= gcd;
}
if(q == 1) printf("Finite\n");
else puts("Infinite");
}
}
return 0;
}