思路:
如果p,q不互质,先把q除以p,q的最大公约数。接下来只要b中包含了所有q的质因子就可以了。可以在gcd(q, b) 不等于1的时候不断地用q除以gcd(q, b)。最后如果q等于1,说明Finite,否则Infinite。这样搞复杂度是O(n * log2(1018)),可以有一个简单的小优化:在循环除过程中,gcd(q, b)肯定是单调不增的,当gcd(q, b)不变的时候,一次性把q里面的gcd(q, b)全除尽,省去了大量欧几里得算法求gcd的时间,这样的话时间复杂度大约是O(n * log(1018))。
傻逼出题人卡输入,搞得我以为算法写错了。可能是log不好卡。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int main() 5 { 6 ios::sync_with_stdio(false); 7 int n; ll p, q, b; 8 while (cin >> n) 9 { 10 for (int i = 0; i < n; i++) 11 { 12 cin >> p >> q >> b; 13 q /= __gcd(p, q); 14 ll tmp = __gcd(q, b); 15 while (tmp != 1) 16 { 17 while (q % tmp == 0) q /= tmp; 18 tmp = __gcd(q, b); 19 } 20 if (q == 1) cout << "Finite" << endl; 21 else cout << "Infinite" << endl; 22 } 23 } 24 return 0; 25 }
当然也可以直接看是否存在k,使得q能整除bk
实现:
1 n = int(input()) 2 ans = '' 3 while n > 0: 4 p, q, b = map(int, input().split(' ')) 5 for i in range(6): 6 b = b * b % q 7 if b * p % q == 0: ans += 'Finite\n' 8 else: ans += 'Infinite\n' 9 n -= 1 10 print (ans)