51nod3399 矩形的数量V7

3399 矩形的数量V7

小明有一个m*n的棋格,他想让你求出其中矩形的数量。但他不希望第u行第v列、第s行第t列的两个格子包含在矩形当中,请你帮帮他。 小明还希望你将得到的结果对1000000007取模。

输入

一行输入六个整数m,n,u,v,s,t。保证不选的两个格子不在同一位置。

输出

输出一个数,表示符合要求的矩形数量。结果对1000000007取模。

数据范围

对于100%的数据,1≤m,n≤10^9,0≤u,s≤m,0≤v,t≤n。

输入样例

4 3 3 3 2 2

输出样例

26

解析:

我们用容斥的思想来解答这道题目:

首先算出棋盘上所有矩形的数量 t1=(m∗(m+1)/2)+(n∗(n+1)/2 。

再算出包含第 u 行第 v 列的矩形数量 t2=u∗v∗(m−u+1)∗(n−v+1) ,以及包含第 s 行第 t 列的矩形数量 t3=s∗t∗(m−s+1)∗(n−t+1) 。

再算出同时包含第 u 行第 v 列和第 s 行第 t 列的矩形数量,这样的矩形:

上边界有 min(u,s) 种,左边界有 min(v,t) 。

下边界有 m−max(u,s) 种,有边界有 n−max(v,t) 。

所以共有 t4=min(u,s)∗min(v,t)∗(m−max(u,s)+1)∗(n−max(v,t)+1) 种。

根据容斥原理,符合要求的矩阵有 t1−t2−t3+t4 种。

放代码:

#include<stdio.h>                                                                                                                          
#define abs(s) (s > 0 ? s : -s)
#define min(a, b) (a > b ? b : a)
#define max(a, b) (a > b ? a : b)

int main() {
    long long m,n,u,s,v,t;
    scanf("%ld %ld %ld %ld %ld %ld", &m, &n, &u, &v, &s, &t);
    long long sum = 0;
    long long  mod = 1000000007;
    sum = m*(m+1)/2%mod*(n*(n+1)/2%mod)%mod;
    sum  = (sum- u*(m-u+1)%mod*v%mod*(n-v+1)%mod - s*(m-s+1)%mod*t%mod*(n-t+1)%mod + mod)%mod;
    sum = sum + min(u,s)*(m-max(u,s)+1)%mod * min(v,t)%mod*(n-max(v,t)+1)%mod;
    sum = ((sum%mod + mod)%mod+mod)%mod;
    printf("%lld", sum);
    return 0;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值