A33258. 公倍数问题问题描述小 A 写了一个 N * M的矩阵 A ,我们看不到这个矩阵,但我们可以知道,其中第 i 行第 j 列的元素 Ai,j 是 i 和 j 的公倍数(i=1,2,,,,N; j=1,2,,,,M)。现在有 K 个小朋友,其中第 k 个小朋友想知道,矩阵 A 中最多有多少个元素可以是 k( k=1,2,,,,K )。请你帮助这些小朋友求解。注意:每位小朋友的答案互不相关,例如,有些位…
填空题
困难
知识点
题目描述
公倍数问题
问题描述
小 A 写了一个 N * M的矩阵 A ,我们看不到这个矩阵,但我们可以知道,其中第 i 行第 j 列的元素 Ai,j 是 i 和 j 的公倍数(i=1,2,,,,N; j=1,2,,,,M)。现在有 K 个小朋友,其中第 k 个小朋友想知道,矩阵 A 中最多有多少个元素可以是 k( k=1,2,,,,K )。请你帮助这些小朋友求解。
注意:每位小朋友的答案互不相关,例如,有些位置既可能是 x,又可能是 y,则它同可以时满足 x,y 两名小朋友的要求。
方便起见,你只需要输出
即可,其中 ans k表示第 k 名小朋友感兴趣的答案。
输入描述
第一行三个正整数 N,M,K 。
输出描述
输出一行,即
。
请注意,这个数可能很大,使用 C++ 语言的选手请酌情使用 long long 等数据类型存储答案。
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 1
2 5 2样例输出 1
9样例解释 1
只有 A1,1 可以是 1,其余都不行。
A1,1 , A1,2 , A2,1 , A22 都可以是 2,而其余不行。
因此答案是 1*1+2*4=9。
样例输入 2
100 100 100样例输出 2
185233数据规模
对于 30 的测试点,保证 N,M,K ≤ 10;
对于 60 的测试点,保证 N,M,K ≤ 500;
对于 100 的测试点,保证 N,M ≤ 100000,K ≤ 1000000 。
参考答案
def count_divisors(limit, num):
s = [0] * (num + 1)
for i in range(1, limit + 1):
for j in range(i, num + 1, i):
s[j] += 1
return s
def main():
N, M, K = map(int, input().split())
s_N = count_divisors(N, 10 ** 6)
s_M = count_divisors(M, 10 ** 6)
result = 0
for k in range(1, K + 1):
result += k * s_N[k] * s_M[k]
print(result)
if __name__ == "__main__":
main()
上一题
下一题