CF 984C Finite or not? (数论)

CF 984C Finite or not? (数论)

给定T(T<=1e5)组数据,每组数据给出十进制表示下的整数p,q,b,求问p/q在b进制意义下是否是有限小数。

首先我们先把p/q约分一下。类比一下b=10的情况,我们发现约分后,只有当q的因数仅有2的倍数和5的倍数时,p/q才是有限小数。于是这启发我们猜结论:仅当q的质因数集合包含在b的质因数集合内时,p/q在b进制下才是有限小数。

那么现在问题就被转换为了:已知两数q,b,问q的质因数集合是否完全包含在b的中。

\(b=p_1^{k_1}p_2^{k_2}...p_n^{k_n}*C\)\(q=p_1^{c_1}p_2^{c_2}...p_n^{c_n}*D\),且\(\{p_i,\ i\le n\}\)是q与b个数最多的共同质因数集合。那么我们要想办法把q中的\(p_i\)给去掉,使q只剩下D。由于\(k_i>0\)\(c_i>0\),那么设\(b'=(b, q)\),那么不停将\(b'\)\(q\)得到\(q'\),最后剩下的数就是D。现在只需判断D是否为1即可。

#include <cstdio>
using namespace std;

typedef long long LL;
LL T, p, q, b;

LL gcd(LL x, LL y){ return y?gcd(y, x%y):x; }

int main(){
    scanf("%lld", &T); LL t;
    while (T--){
        scanf("%lld%lld%lld", &p, &q, &b);
        t=gcd(p, q); p/=t; q/=t;
        //现在问题转化为求q的质因数集合是否被包含在b的内
        b=gcd(q, b); LL lq=0;
        while (q!=lq){
            lq=q;
            q/=gcd(q, b);
        }
        if (q==1) puts("Finite"); else puts("Infinite");
    }
    return 0;
}
posted @ 2018-05-16 20:37  pechpo  阅读(385)  评论(0编辑  收藏  举报