zoukankan      html  css  js  c++  java
  • 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
    '
     8     else: ans += 'Infinite
    '
     9     n -= 1
    10 print (ans)
  • 相关阅读:
    操作系统指纹
    扫描工具
    ms08_067利用过程
    SQL注入攻击
    SMB/CIFS协议解析
    蓝桥杯 历届试题 大臣的旅费
    九度oj 题目1009:二叉搜索树
    蓝桥杯 算法提高 6-17 复数四则运算
    poj 2182 Lost Cows
    poj 2501 Average Speed
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9060224.html
Copyright © 2011-2022 走看看