筆試編程題彙總(3)


"""
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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章