卧薪尝胆,厚积薄发。
Finite or not?
Date: Thu Sep 20 15:02:34 CST 2018 In Category: NoCategory

Description:

有 $n$ 组数据,每一组数据读入一个分数的分子 $p$ 、分母 $q$ 和进制 $b$ ,求在 $b$ 进制下 $\frac{p}{q}$ 是否为有限小数。
$1\le n \le 10^5,1\le p,q,b\le 10^{18}$

Solution:

先把 $p$ 和 $q$ 约分,然后这时只有 $q$ 的所有质因数都是 $b$ 的质因数时才合法,于是不停除 $gcd$ 即可,有一些优化就是可以每次把 $b$ 变成 $gcd$ ,每次除掉好多 $gcd$ 。
复杂度上界是 $O(10^5\log^210^{18})$ ,但实际上跑不满。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline ll read()
{
register ll res = 0;
register char c = getchar();
while(!isdigit(c))c = getchar();
while(isdigit(c))
{
res = (res << 1) + (res << 3) + c - '0';
c = getchar();
}
return res;
}
ll p,q,b;
ll gcd(ll a,ll b){return (b == 0 ? a : gcd(b,a % b));}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
p = read();q = read();b = read();
ll g = gcd(p,q);
p /= g;q /= g;
while(q != 1 && (g = gcd(q,b)) != 1)
{
while(q % g == 0)q /= g;
b = g;
}
if(q == 1)puts("Finite");
else puts("Infinite");
}
return 0;
}
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡