题意
N组测试数据,每组有三个数p,q,b,问pq\frac {p}{q}qp在b进制下是否为无限小数?
思路
首先,一个最简分数是不是无限小数跟分子无关,只跟分母有关。
在b进制下,如果q∣bk,k∈Zq | b^k,k∈Zq∣bk,k∈Z那么pq\frac {p}{q}qp就是一个有限小数,否则就是无限小数。
q∣bkq | b^kq∣bk,那么qqq的素因子应该是bkb^kbk的子集。我们做迭代q÷gcd(b,q)q \div \gcd (b,q)q÷gcd(b,q),如果迭代之后q≠1q≠1q̸=1,那么分数就是无限小数,否则就是有限小数。但是这样做复杂度为Onlog21018On \log^2 10^{18}Onlog21018会超时。
我们上述方法中加入b=gcd(b,q)b=\gcd(b,q)b=gcd(b,q),不会影响答案,但是复杂度变为Onlog1018On \log 10^{18}Onlog1018,就能过了。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
LL p, q, b;
scanf("%lld%lld%lld", &p, &q, &b);
LL G = __gcd(p, q);
p /= G, q /= G;
while (1)
{
LL g = __gcd(b, q);
if (g == 1)
break;
b = g, q /= g;
}
if (p == 0 || q == 1)
puts("Finite");
else
puts("Infinite");
}
return 0;
}
/*
2
6 12 10
4 3 10
*/