有限小数(小数转换进制,判断一个数的质因子是否是另一个数质因子的子集)

题意

给定三个整数pqb,请你计算十进制表示下的p/q的结果在b进制下是否为有限小数。

题目链接:https://www.acwing.com/problem/content/4487/

数据范围

1T105
0p,q,b1018

思路

小数转换进制的方法与整数不同。整数是一直除以b,直到商为0为止;而小数是一直乘b,直到变为整数为止,如果一直不能变为整数,则为无限小数。

因此,对于最简分数p/q,如果在二进制下它为有限小数,则存在正整数k,使得q|bk。即,q的质因子是b质因子的子集。

如果直接进行质因子分解,那么时间复杂度是根号的,会超时,因此需要思考更快的算法。

如果gcd(q,b)1,那么一直做q=q/gcd(q,b)。如果循环结束后q1,则说明q中存在b中不存在的质因子。这样做还是超时的,因此需要继续优化。

  • 可以在每次循环的时候让b=gcd(b,q)
  • 找到一个gcd(q,b)q就把这个因子给除干净

这样就可以顺利通过此题了。

代码

#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;
}
posted @   pbc的成长之路  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示