有限小数(小数转换进制,判断一个数的质因子是否是另一个数质因子的子集)
题意
给定三个整数,,,请你计算十进制表示下的的结果在进制下是否为有限小数。
题目链接:https://www.acwing.com/problem/content/4487/
数据范围
思路
小数转换进制的方法与整数不同。整数是一直除以,直到商为为止;而小数是一直乘,直到变为整数为止,如果一直不能变为整数,则为无限小数。
因此,对于最简分数,如果在二进制下它为有限小数,则存在正整数,使得。即,的质因子是质因子的子集。
如果直接进行质因子分解,那么时间复杂度是根号的,会超时,因此需要思考更快的算法。
如果,那么一直做。如果循环结束后,则说明中存在中不存在的质因子。这样做还是超时的,因此需要继续优化。
- 可以在每次循环的时候让
- 找到一个,就把这个因子给除干净
这样就可以顺利通过此题了。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int T;
scanf("%d", &T);
while(T -- ) {
ll p, q, b;
scanf("%lld%lld%lld", &p, &q, &b);
ll d = gcd(p, q);
q /= d;
while(q > 1) {
d = gcd(q, b);
if(d == 1) break;
while(q % d == 0) q /= d, b = d;
}
if(q == 1) puts("YES");
else puts("NO");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】