一个分数是否可以除尽
首先约分,1/2, 1/125可以除尽的原因是:十进制10=2*5->1/2,1000=2^3*5^3->1/125也就是10包括了2,125的所有质因数
b进制下,分母q是有限小数的充分条件是b有q的所有质因数
因此,这个问题就转化为了:
求b是否包含了q的所有质因子
一般是想到全部罗列再比较(超时),
这里就可以用gcd的办法,找出两者gcd如果gcd可以整除q,则b包所有q的质因子
——这里还可以优化下,就是b的除gcd以外的因子都没有用所有所以b=gcd
代码
#include <bits/stdc++.h> using namespace std; long long n,g,p,q,b; long long gcd(int a,int b){ return b?gcd(b,a%b):a; } int main(int argc, char** argv) { scanf("%lld",&n); while(n--){ scanf("%lld%lld%lld",&p,&q,&b); q/=gcd(p,q); while(1){ // g=gcd(q,b);//未优化 // while(q%g==0){ // q/=g; // } b=gcd(q,b); if(b==1){ if(q==1) puts("Finite"); else puts("Infinite"); break; } while(q%b==0){ q/=b; } } } return 0; }