【cf 483 div2 -C】Finite or not?(数论)

链接:http://codeforces.com/contest/984/problem/C

题意

三个数p, q, b, 求p/q在b进制下小数点后是否是有限位。

思路

题意转化为是否q|p*b^x,即看b和q有没有相同的质因子。如果用筛选质因子的话1e18的数会超时,所以每次求出b和q的gcd,再让q/gcd,如果q最后是1那么b和q拥有相同质因子,输出Finite,反之Infinite。

附代码:

#include <bits/stdc++.h>
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()
{
    LL p, q, b, t;
    cin>>t;
    while(t--)
    {
        scanf("%lld%lld%lld", &p, &q, &b);
        q = q/gcd(p, q);
        LL a;
        while(q!=1)
        {
            a = gcd(b, q);
            if(a == 1) break;
            while(q%a==0)  
            {
                q /= a;
            }
        }
        if(q!=1) puts("Infinite");
        else puts("Finite");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lesroad/p/9163887.html