「日常训练」 Finite or not? (CFR483D2C)

题意(Codeforces 984C)

给定p,q,b,问pq在进制b下是否是无限小数。

分析

这个我一开始做的很挫,激情纯模拟+摸……但是做着做着就能发现不对劲了。比如说,p与能否无限无关(因为只是倍数关系);问题的实质在于q能否被b单纯的表示(这句词是个感性的认识,但是很关键)。
因此,根据这两个认知,我们能够看出,判断无限与否的重点是b是否拥有q的全部素因子。这个认知跃迁的可能有点大,但是稍微想一下就能明白。
注意到b与q的数量级,跟个弱智一样的找素数是显然tle的(我之前就是这么干的)。感谢其他人的题解:我们直接不断对b和q除去其gcd,然后看q是否能够除净即可。问题就这么解决了。我还是太菜啦

代码

#include <bits/stdc++.h>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define QUICKIO                  
    ios::sync_with_stdio(false); 
    cin.tie(0);                  
    cout.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned long long;
ll gcd(ll x,ll y)
{
    return y==0?x:gcd(y,x%y);
}
int main()
{
    int n; scanf("%d",&n);
    while(n--)
    {
        ll p,q,b; 
        scanf("%lld%lld%lld",&p,&q,&b);
        q/=gcd(p,q);
        while(q!=1&&b!=1)
        {  
          b=gcd(q,b);  
          q/=b;  
        }
        puts(q==1?"Finite":"Infinite");
    }
    return 0;
}
如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
原文地址:https://www.cnblogs.com/samhx/p/9652073.html