题意
N组测试数据,每组有三个数p,q,b,问 p q \frac {p}{q} qp在b进制下是否为无限小数?
思路
首先,一个最简分数是不是无限小数跟分子无关,只跟分母有关。
在b进制下,如果
q
∣
b
k
,
k
∈
Z
q | b^k,k∈Z
q∣bk,k∈Z那么
p
q
\frac {p}{q}
qp就是一个有限小数,否则就是无限小数。
q
∣
b
k
q | b^k
q∣bk,那么
q
q
q的素因子应该是
b
k
b^k
bk的子集。我们做迭代
q
÷
gcd
(
b
,
q
)
q \div \gcd (b,q)
q÷gcd(b,q),如果迭代之后
q
≠
1
q≠1
q̸=1,那么分数就是无限小数,否则就是有限小数。但是这样做复杂度为
O
n
log
2
1
0
18
On \log^2 10^{18}
Onlog21018会超时。
我们上述方法中加入
b
=
gcd
(
b
,
q
)
b=\gcd(b,q)
b=gcd(b,q),不会影响答案,但是复杂度变为
O
n
log
1
0
18
On \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
*/