CF-Codeforces Round #483 (Div. 2)-C-Finite or not?
阿新 • • 發佈:2018-12-27
描述
題解
首先求 的最大公約數,為了在十進位制下約分,此時我們先考慮十進位制的情況什麼條件才能有限,最簡分數 能化為有限小數的充要條件是分母 不含有 和 以外的質因數,那麼我們可以嘗試猜一下, 在 進位制下想要有限的充要條件是 不含 拆解後的質因數以外的質因數。所以此時我們無需考慮 ,只用不斷去除 中的 的質因子,如果可以最後把 拆解成 那麼就是有限,否則無限。
程式碼
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int n;
ll gcd(ll x, ll y)
{
if (!x || !y)
{
return x > y ? x : y;
}
for (ll t; static_cast<void>(t = x % y), t; x = y, y = t) ;
return y;
}
int main(int argc, const char * argv[])
{
cin >> n;
while (n--)
{
ll p, q, b;
scanf("%lld%lld%lld", &p, &q, &b);
if (p == 0)
{
puts("Finite");
continue;
}
ll g = gcd(p, q);
q /= g;
p /= g;
while (q > 1 )
{
g = gcd(q, b);
if (g == 1)
{
break;
}
while (q % g == 0)
{
q /= g;
}
}
if (q == 1)
{
puts("Finite");
}
else
{
puts("Infinite");
}
}
return 0;
}