【Codeforces 983A】Finite or not?(数学)

6 篇文章 0 订阅

A. Finite or not?

Description

求 p / q 的小数部分用 b 进制表示是否是有限小数

Input

输入n (1 ≤ n ≤ 1e5)n次查询

p q b (0 ≤ p ≤ 1e18,1 ≤ q ≤ 1e18,2 ≤ b ≤ 1e18)

Output

是否为有限小数

Sample Input
  
  6
  6 12 10
  4 3 10
  1 1 2
  9 36 2
  4 12 3
  3 5 4

Sample Output
  
  Finite
  Infinite
  Finite
  Finite
  Finite
  Infinite

Hint

6/12=1/2=0,5(10)

4/3=1,(3)10

9/36=1/4=0,01(2)

4/12=1/3=0,1(3)

Solution

​ 数学

将小数转换为b进制,需要用小数部分乘进制,如果能变成整数,则有限。将分数化为最简分数后,将分母分解质因数,如果其所有质因子都是b的因子,那么可以转换为有限小数。显然,分解质因数不能实现,可以转化为求q与b的gcd

Code
  #include <cstdio>
  #include <cstring>
  #include <algorithm>
  #define maxn 100005
  #define INF 0x3f3f3f3f
  typedef long long ll;
  
  using namespace std;
  
  ll gcd(ll a, ll b)
  {
      if (b == 0)
          return a;
      return gcd(b, a % b);
  }
  int main()
  {
      int n;
      ll p, q, b;
  
      scanf("%d", &n);
      for (int i = 1; i <= n; i++){
          scanf("%I64d%I64d%I64d", &p, &q, &b);
          ll g = gcd(p, q);
          p /= g; q /= g;
          bool flag = true;
          while(q != 1){
              ll g = gcd(q, b);
              if (g == 1){
                  flag = false;
                  break;
              }
              while(q % g == 0 && q != 1) q /= g;
          }
          if (flag)
              printf("Finite\n");
          else
              printf("Infinite\n");
      }
      return 0;
  }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值