Description
求 p / q 的小数部分用 b 进制表示是否是有限小数
Input
输入n (1 ≤ n ≤ 1e5)n次查询
p q b (0 ≤ p ≤ 1e18,1 ≤ q ≤ 1e18,2 ≤ b ≤ 1e18)
Output
是否为有限小数
Sample Input
6 6 12 10 4 3 10 1 1 2 9 36 2 4 12 3 3 5 4
Sample Output
Finite Infinite Finite Finite Finite Infinite
Hint
6/12=1/2=0,5(10)
4/3=1,(3)10
9/36=1/4=0,01(2)
4/12=1/3=0,1(3)
Solution
数学
将小数转换为b进制,需要用小数部分乘进制,如果能变成整数,则有限。将分数化为最简分数后,将分母分解质因数,如果其所有质因子都是b的因子,那么可以转换为有限小数。显然,分解质因数不能实现,可以转化为求q与b的gcd
Code
typedef long long ll; using namespace std; ll gcd(ll a, ll b) { if (b == 0) return a; return gcd(b, a % b); } int main() { int n; ll p, q, b; scanf("%d", &n); for (int i = 1; i <= n; i++){ scanf("%I64d%I64d%I64d", &p, &q, &b); ll g = gcd(p, q); p /= g; q /= g; bool flag = true; while(q != 1){ ll g = gcd(q, b); if (g == 1){ flag = false; break; } while(q % g == 0 && q != 1) q /= g; } if (flag) printf("Finite\n"); else printf("Infinite\n"); } return 0; }