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()