有限小数

有限小数

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

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含三个整数 p,q,b

输出格式

每组数据输出一行结果,如果 p/q 的结果在 b 进制下是有限小数,则输出 YES ,否则输出 NO 。

数据范围

前五个测试点满足 1T10
所有测试点满足 1T1050p10181q10182b1018

输入样例1:

2
6 12 10
4 3 10

输出样例1:

YES
NO

输入样例2:

4
1 1 2
9 36 2
4 12 3
3 5 4

输出样例2:

YES
YES
YES
NO

 

解题思路

  对于pq,假设已经约分为最简分式,且只考虑小数的部分(即有p<q,如果p>q只需把整数部分去掉就可以),如果pqb进制下是一个有限小数,那么有(pq)b=0.a1a2ak,在十进制下表示就是(pq)10=a1b1+a2b2++akbk。现在令左右两式同时乘上bk,得到(pq)bk=a1bk1+a2bk2++ak,可以发现等式右边的a1bk1+a2bk2++ak是一个整数,因此(pq)bk也是一个整数,又因为pq已经是最简分式,因此有qbk

  因此pqb进制下能用k位来表示有限小数qbk

  下面来推pqb进制下能用k位来表示有限小数qbk

  首先对于a1b1+a2b2++akbk,一定是一个小于1的数,这是以为0ai<b,对ai进行放缩,取ai=b1,有a1b1+a2b2++akbk(b1)×(b1+b2++bk)=(b1)×1bkb1=1bk<1

  现在令(pq)=a1b1+a2b2++akbk左右两边乘以b,得到(pq)b=a1+a2b1++akbk+1,其中等式右边的a1是一个整数,a2b1++akbk+1是一个小于1的数,即得到b进制下的第1位数a1。把a1去掉,剩下的数继续乘上一个b,即可得到b进制下的第2位数a2,以此类推,一共进行k次,就可以得到k位的b进制数,因为qbk,所有在等式左右两边乘以bk后,等式右边得到的就只有一个整数而没有小数,意味着可以转换为有限的b进制数。因此有pqb进制下能用k位来表示有限小数qbk

  因此pqb进制下能用k位来表示有限小数qbk

  因此可以通过qbk来判断p/qb进制下是否为有限小数。先将p/q约分,然后判断约分后的q的质因子是否包含在b的质因子内,这里如果用质因数分解会超时,因此需要用辗转相除法来判断,每次求d=gcd(q,b),如果d=1q>1说明qb,在b进制下为无限小数。然后还会卡常数,需要优化,即每次求出d后,需要一次性把qd来除干净。

  AC代码如下:

复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 
 6 LL gcd(LL a, LL b) {
 7     return b ? gcd(b, a % b) : a;
 8 }
 9 
10 int main() {
11     int tot;
12     scanf("%d", &tot);
13     while (tot--) {
14         LL p, q, b;
15         scanf("%lld %lld %lld", &p, &q, &b);
16         q /= gcd(p, q);
17         
18         while (q > 1) {
19             LL d = gcd(q, b);
20             if (d == 1) break;
21             
22             // 如果直接q /= d; 会被卡常数
23             // 一次除干净
24             while (q % d == 0) {
25                 q /= d;
26             }
27         }
28         printf("%s\n", q == 1 ? "YES" : "NO");
29     }
30     
31     return 0;
32 }
复制代码

 

参考资料

  AcWing 4484. 有限小数(AcWing杯 - 周赛):https://www.acwing.com/video/3978/

posted @   onlyblues  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示