传送门 题意:给你T组数据,一组数据中有p,q,b。判断p/g在b进制下有限还是无限。
思路:看了很多组题解,什么质因子把我搞的一头雾水,咱不那么高大上,简单分析一下。
补充知识点:小数转化为几进制,那么就用它乘几,如果来到了个位,就将个位拿出来,小数位继续乘,直到乘出一个小数全为0的数为止。实在不懂可自行百度十进制小数转化二进制<-这是链接 首先:p/g如果是有限小数的话,那么与p是无关的,那么我们看1/g即可,如果b能够乘1/g是得出一个整数的话。那么它必是有限的。
这时候我们可以考虑1/gb^i(b的i次方),怎么得出的?【回忆一下前文(小数转化为几进制,那么就用它乘几,我们可以省略之前取出个位的步骤,直接用b去乘1/g,有可能 1/g 乘以 i个b相乘(b^i) 可以得到一个整数)。】那么此时问题就可以转化了,转化为 b的i次方 1/q 是否可以的到一个整数。那么只有b的i次方可以整除q的时候即 q是b的一个因子。
举个例子:6的i次方可以除9吗 一个6肯定不行,那6的平方呢,36就可以了,那么1 9 6 这个数就是可以的。
再看个别的,3的i次方可以除6吗 ,分析一下 3的2次方不行,3的3次方更不行了,也就是说,这个b必须一开始就有q的全部因子,这些因子还必须是质数。
拿1 9 6来说,我们看6(b)这个数 它的因子是不是有2和3是质数? 而9(q)它的因子是不是有3是质数?那么是不是只有在q的因子集合是a的因子集合的子集的时候,b的i次方才能整除q呢? 这就是那些帖子说的质因子。
那么接下来就好办了,我们可以用b=__gcd(q,b);来实现质因子的判断。
让b不断的等于b和q的最大公约数,再让p去除,假如p除不了,那是不是就代表b和p不存在相同的因子了?
而如果q能够整除b(此时的b是b和q的最大公约数),那么它最后必然是1的。
那么用代码实现即可。
while (q!=1)
{
b=__gcd(q,b);
if(b==1)
{
flag=false;
break;
}
q/=b;
}
const int maxn = 1e5 + 5;
using namespace std;
char a[105][105];
int main()
{
int T;
ios::sync_with_stdio(0);//关闭输入输出端同步,提高速度。
cin >> T;
while (T--)
{
ll p, q, b;
cin >> p >> q >> b;
q /= __gcd(p, q);
//ll g=gcd(q,b);
bool flag = true;
while (q!=1)
{
b=__gcd(q,b);
if(b==1)
{
flag=false;
break;
}
q/=b;
}
if (flag || p == 0)
cout << "Finite" << endl;
else
cout << "Infinite" << endl;
}
//system("pause");
return 0;
}