「日常訓練」 Finite or not? (CFR483D2C)

SamHX發表於2018-05-24

題意(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;
}

相關文章