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;
}