題意(Codeforces 984C)
給定,問在進位制b下是否是無限小數。
分析
這個我一開始做的很挫,激情純模擬+摸……但是做著做著就能發現不對勁了。比如說,p與能否無限無關(因為只是倍數關係);問題的實質在於q能否被單純的表示(這句詞是個感性的認識,但是很關鍵)。
因此,根據這兩個認知,我們能夠看出,判斷無限與否的重點是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;
}