CF983A Finite or not?

思路:

如果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)

猜你喜欢

转载自www.cnblogs.com/wangyiming/p/9060224.html