Python n条水平平行线与m条垂直平行线相交的平行四边形的数量

Python n条水平平行线与m条垂直平行线相交的平行四边形的数量(Number of parallelograms when n horizontal parallel lines intersect m vertical parallel lines)

给定两个正整数n和m。任务是计算 n 条水平平行线与 m 条垂直平行线相交可以形成任意大小的平行四边形的数量。 

例子: 

输入:n = 3, m = 2

输出:3 

2个尺寸为 1x1 的平行四边形和 1 个尺寸为 2x1 的平行四边形。

输入:n = 5, m = 5

输出:100

这个想法是使用组合,即从给定的 n 个项目中选择 k 个项目的方式数由n C r,表示如图:给出。 
要形成平行四边形,我们需要两条水平平行线和两条垂直平行线。因此,选择两条水平平行线的方式数为n C 2,表示如图:,选择两条垂直平行线的方式数为m C 2,表示如图:。因此,可能的平行四边形总数为n C 2 x m C 2,表示如图:

以下是此方法的实现: 

# Python Program to find number of parallelogram when
# n horizontal parallel lines intersect m vertical
# parallel lines.
MAX = 10;

# Find value of Binomial Coefficient
def binomialCoeff(C, n, k):
    
    # Calculate value of Binomial Coefficient
    # in bottom up manner
    for i in range(n + 1):
        for j in range(0, min(i, k) + 1):
        
            # Base Cases
            if (j == 0 or j == i):
                C[i][j] = 1;

            # Calculate value using previously
            # stored values
            else:
                C[i][j] = C[i - 1][j - 1] + C[i - 1][j];

# Return number of parallelogram when n horizontal
# parallel lines intersect m vertical parallel lines.
def countParallelogram(n, m):
    C = [[0 for i in range(MAX)] for j in range(MAX)]

    binomialCoeff(C, max(n, m), 2);

    return C[n][2] * C[m][2];

# Driver code
if __name__ == '__main__':
    n = 5;
    m = 5;
    print(countParallelogram(n, m));

# This code is contributed by 29AjayKumar

 输出:
100

时间复杂度: O(n 2 ) ,如图:

辅助空间: O(n 2 ),如图:

使用基础数学

同样的问题可以通过使用基本数学来解决,因为我们知道n C 2 = n*(n-1)/2, m C 2,表示如图:   也是如此,所以只需使用基本数学,我们就可以在 O(1) 中解决这个问题

以下是上述方法的实现:

def find_the_parallelogram(n, m):
    # Calculate the number of parallelograms using the formula:
    # nC2 = (n * (n - 1)) / 2
    # mC2 = (m * (m - 1)) / 2
    result = ((n * (n - 1)) // 2) * ((m * (m - 1)) // 2)
    return result

# Driver code
if __name__ == "__main__":
    n = 5
    m = 5
    print(find_the_parallelogram(n, m))

输出:
100

时间复杂度:O(1)

空间复杂度:O(1)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hefeng_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值