3827 最小正整数(最小公倍数)

1. 问题描述:

给定两个整数 n 和 k。请你计算,末尾至少有连续 k 个 0,并且可以被 n 整除的最小正整数。例如,当 n = 375,k = 4 时,满足条件的最小正整数为 30000。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。每组数据占一行,包含两个整数 n,k。

输出格式

每组数据输出一行结果,表示满足条件的最小正整数。

数据范围

所有数据满足 1 ≤ T ≤ 10,1 ≤ n ≤ 10 ^ 9,0 ≤ k ≤ 8。

输入样例:

6
375 4
10000 1
38101 0
123456789 8
1 0
2 0

输出样例:

30000
10000
38101
12345678900000000
1
2
来源:https://www.acwing.com/problem/content/description/3830/

2. 思路分析:

分析题目可以知道满足条件的正整数需要满足两个条件,第一个是能够被n整除,也即是n的倍数,第二个条件是末尾至少有连续的k个0等价于能够被10 ^ k整除,写成具体的表达式为c * n = 10 ^ k * t = 2 ^ k * 5 ^ k * t,c为一个正整数,也即给n乘上一个最小的c使得至少能够分解成k个2和k个5,我们可以先求解出n中有a个2和b个5,则c至少需要贡献a' = max(0,k - a)个2和b' = max(0,k - b)个5,所以最终满足的正整数为n * 2 ^ max(0,k - a) * 5 ^ max(0,k - b),除了使用这种方法推导之外,其实考虑到满足的正整数x是n的倍数,所以x能够整除n,并且末尾有连续的k个0所以x能够整除100...0(k个0),所以求解这两个数的最小公倍数即可。

3. 代码如下:

class Solution:
    # 计算x中有多少个p
    def get_p(self, x: int, p: int):
        res = 0
        while x % p == 0:
            res += 1
            x //= p
        return res
    
    # 计算b ^ a
    def get_c(self, a: int, b: int):
        res = 1
        for i in range(a):
            res *= b
        return res

    def process(self):
        T = int(input())
        for i in range(T):
            n, k = map(int, input().split())
            # a, b为n中有多少个2和多少个5
            a, b = self.get_p(n, 2), self.get_p(n, 5)
            print(n * self.get_c(k - a, 2) * self.get_c(k - b, 5))


if __name__ == "__main__":
    Solution().process()

最小公倍数:

class Solution:
    # 求解a, b的最大公约数
    def gcd(self, a: int, b: int):
        return a if b == 0 else self.gcd(b, a % b)

    def process(self):
        T = int(input())
        for i in range(T):
            n, m = map(int, input().split())
            k = 1
            for i in range(m):
                k *= 10
            # 求解n, k的最小公倍数
            print(n * k // self.gcd(n, k))


if __name__ == '__main__':
    Solution().process()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值