《模运算》
1.倍数问题
题目描述
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 nn 个数,希望你从这 nn 个数中找到三个数,使得这三个数的和是 KK 的倍数,且这个和最大。数据保证一定有解。
输入描述
第一行包括 2 个正整数 n, Kn, K。
第二行 nn 个正整数,代表给定的 nn 个数。
其中,1≤n ≤105, 1≤K ≤1031≤n ≤105, 1≤K ≤103,给定的 nn 个数均不超过 108108。
输出描述
输出一行一个整数代表所求的和。
输入输出样例
示例
输入
4 3
1 2 3 4
输出
9
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码
import os
import sys
# 请在此输入您的代码
n,k = map(int,input().split())
u = list(map(int,input().split()))
u.sort(reverse=True)
m =[[0] *3 for _ in range(k)]
for i in range(n):
y = u[i] %k
if m[y][0] == 0: m[y][0] = u[i]
elif m[y][1] == 0: m[y][1] = u[i]
elif m[y][2] == 0: m[y][2] = u[i]
ans = 0
for x in range(0,2*k+1,k):
for a in range(k): #这里指余数
for b in range(k):
c = x -a-b
if c >= 0 and c<k:
ans = max (ans,m[a][0] + m[b][b==a] +m[c][(a==c) + (b==c)])
print(ans)
《GCD与LCM》
2.等差数列
题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入描述
输入的第一行包含一个整数 NN。
第二行包含 NN 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1 ∼ AN 并不一定是按等差数列中的顺序给出)
其中,2≤N≤105,0≤Ai≤109。
输出描述
输出一个整数表示答案。
输入输出样例
示例
输入
5
2 6 4 10 20
输出
10
样例说明: 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
import os
import sys
# 请在此输入您的代码
from math import *
n = int(input())
a = list(map(int,input().split()))
a.sort()
d =0
for i in range (1,n): d = gcd(d,a[i]-a[i-1])
if d==0:print(n)
else:print((a[-1]-a[0])//d + 1)
3.核桃的数量
题目描述
小张是软件项目经理,他带领 3 个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
-
各组的核桃数量必须相同
-
各组内必须能平分核桃(当然是不能打碎的)
-
尽量提供满足 1,2 条件的最小数量(节约闹革命嘛)
输入描述
输入一行 a,b,c,都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)。
输出描述
输出一个正整数,表示每袋核桃的数量。
输入输出样例
示例
输入
2 4 5
输出
20
运行限制
- 最大运行时间:1s
- 最大运行内存: 64M
import os
import sys
# 请在此输入您的代码
from math import *
def lcm(x,y): return x//gcd(x,y)*y
a,b,c = map(int,input().split())
k = lcm(a,b)
print(lcm(k,c))