"""
description:
given a (X,Y,Z), 1 <= x <= X, 1<=y<=Y, 1<=z<=Z, (x,y,z) is all integer,
(x,y,z) can form a triangle, give the number of triplet that satisfies the condition.
you can give the modulus of 1000000007
example 1:
input:
2 3 3
output:
9
(1,1,1),(1,2,2),(1,3,3),(2,1,2),(2,2,1),(2,2,2),(2,2,3),(2,3,2),(2,3,3)
"""
"""
基本思想:寻找满足三角不等式的三元组个数,本质上是一个线性规划(整数规划)问题,然而这个问题太经典了,实际上是有公式的。这里实现的是对最小的一维进行遍历,在二维平面上总结公式的做法,相当于假设不知道公式,而去总结归纳。在二维平面内,所有点减去不符合的点,剩下的就是符合的点
"""
import sys
fixed_num = int(10**9+7)
def get_once(z, xyz):
X, Y, _=xyz
data = [
int((z-1)*z/2),
int((X-z+1)*(X-z)/2),
int((Y-z+1)*(Y-z)/2)
]
return int(X*Y - data[0] - data[1] - data[2])
def get_triple_num(xyz):
num = 0
for z in range(xyz[2]):
z += 1
num += get_once(z, xyz)
print(num)
return num % fixed_num
def my_min(data):
min_idx, min_data = 0, data[0]
for idx, data_temp in enumerate(data):
if data[idx]<min_data:
min_idx = idx
min_data = data_temp
return min_idx, min_data
if __name__=="__main__":
line = sys.stdin.readline().strip()
x, y, z = line.split(" ")
xyz = [int(x),int(y),int(z)]
min_idx, min_data = my_min(xyz)
xyz[min_idx], xyz[2] = xyz[2], xyz[min_idx]
print(get_triple_num(xyz))
笔试编程题汇总(3)
最新推荐文章于 2020-05-14 20:08:30 发布