P2241 统计方形(数据加强版) python解法

求n*m网格内矩形的数目 - tenos - 博客园 (cnblogs.com)

法一(题解推规律+暴力枚举得到):

n,m=map(int,input().split())
sqr,rec=0,0 #正方形和长方形个数
#以长宽做循环,每次求n*m大小的矩形的个数
#题解是从0开始的,我这里从1开始,所以后面要+1
for i in range(1,n+1):
    for j in range(1,m+1):
        if i==j:  #正方形
            sqr+=(n-i+1)*(m-j+1)
        else:  #长方形
            rec+=(n-i+1)*(m-j+1)
print(sqr,rec,end=" ")

但是python这种方法会超时,所以用法二更好一点。

法二(公式法):

n*m矩阵内有共有n* (n+1)/2*m* (m+1)/2个子矩形

n, m = map(int, input().split())
#这里始终要让行数<列数,要不然再后面的公式计算中会出问题,且正方形肯定要取长宽中的小数
'''
如n=3,m=5时得3*5//2*5*6//2=105
而n=5,m=3时得5*6//2*3*4//2=90就会出错
'''
if n > m: #大于就交换
    n, m = m, n
sum = int(n * m * (1+n) * (1+m) / 4) #对公式进行稍微合并
fang = 0
for i in range(1, n+1):
    fang += (n-i+1) * (m-i+1)
#因为i==j时为正方形,这个时候就只要进行单循环就行了,因为不用找长方形了
print(fang, sum-fang) #总矩形-正方形=长方形

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值