博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF984 C. Finite or not?【数论/GCD】
阅读量:5233 次
发布时间:2019-06-14

本文共 1136 字,大约阅读时间需要 3 分钟。

【链接】:

【题意】:n组样例,对于每组样例,给你三个数p q b,问你p/q在b进制下是不是一个有限小数,是的话输出Finite,否则输出Infinite。
【分析】:b的过程是对q约分,那么只要b包含q全部的因子即可。考虑1/q,一定是一个小于等于1的数,考虑将小数转化为b进制的过程,每次将小数乘以b然后取整数部分,直到这个小数变成了0,也就是说如果某个小数1/q在b进制下可以被有限表示。
因此。对于在b进制下的小数p/q,只要看看q的质因子是不是都是b的质因子就可以了,显然可以用gcd来搞。每次都用q去除gcd(q,b)。如果最后q能够变成1.那就说明q的质因子都b的质因子。(gcd本质上就是两个数相同质因子中取指数较小的那个,然后全都乘起来)
但不要每次都重新获取q,b的gcd。用上次的结果尝试继续除就好。
【代码】:

#include 
#define ll long long#define pb push_back#define inf 0x3f3f3f3f#define pll pair
#define rep(i,a,b) for(int i=a;i<=b;i++)#define rep1(i,a,b) for(int i=a;i>=b;i--)#define rson rt<<1|1,m+1,r#define lson rt<<1,l,musing namespace std;int main(){ int t; scanf("%d",&t); while(t--) { ll p,q,b; scanf("%lld%lld%lld",&p,&q,&b); ll g=__gcd(p,q); p/=g; q/=g; if(p==0||q==1){ printf("Finite\n"); continue; } while(q!=1&&b!=1) { b=__gcd(q,b); q/=b; } if(q==1) printf("Finite\n"); else printf("Infinite\n"); }}/*26 12 104 3 1041 1 29 36 24 12 33 5 4*/

转载于:https://www.cnblogs.com/Roni-i/p/9159045.html

你可能感兴趣的文章
Mono 异步加载数据更新主线程
查看>>
初识lua
查看>>
我是插件狂人,jDuang,jValidator,jModal,jGallery
查看>>
张季跃 201771010139《面向对象程序设计(java)》第四周学习总结
查看>>
如何解除循环引用
查看>>
android中fragment的使用及与activity之间的通信
查看>>
jquery的contains方法
查看>>
python3--算法基础:二分查找/折半查找
查看>>
Perl IO:随机读写文件
查看>>
转:基于用户投票的排名算法系列
查看>>
WSDL 详解
查看>>
[转]ASP数组全集,多维数组和一维数组
查看>>
C# winform DataGridView 常见属性
查看>>
逻辑运算和while循环.
查看>>
Nhiberate (一)
查看>>
c#后台计算2个日期之间的天数差
查看>>
安卓开发中遇到的小问题
查看>>
ARTS打卡第3周
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>