模拟赛 藏妹子之处(时限1000ms 内存128MB)

问题描述:

今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格。但要满足如下的两个条件:

(1)任意两个单元格都不在同一行。

(2)任意两个单元格都不在同一列。

选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|)。狗狗想知道的是,花费在minT到maxT之间的方案数有多少。

答案模1000000007。所谓的两种不同方案是指:只要它选中的单元格有一个不同,就认为是不同的方案。

输入格式:

 一行,4个整数,R、C、minT、maxT。3≤R,C≤4000, 1≤minT≤maxT≤20000。

对于30%的数据, 3 R, C 70。 

输出格式:

 一个整数,表示不同的选择方案数量模1000000007后的结果。

输入输出样例:

输入样例

3 3 1 20000

 

3 3 4 7

 

4 6 9 12

7 5 13  18

 

4000 4000  4000  14000

输出样例

6

0

264

1212

859690013

 

题解

画图可知,三点的费用就是“以‘三点中离得最远的两点’作为矩形对角两点”的矩形的边长,枚举边长n^2可过。至于ans*6是因为可以看做3*3的矩阵上选三行列各不相同的点,共有六种选法(3*2*1)。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
int n,m,l,r,i,j,w;
ll ans;
int main()
{
	freopen("excel.in","r",stdin);
	freopen("excel.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&l,&r);
	for(i=2;i<n;i++)
	for(j=2;j<m;j++)
	   {w=(i+j)*2;
		if(w>=l&&w<=r)
		   {ans+=(ll)(i-1)*(j-1)*(n-i)*(m-j)%mod;}
	   }
	printf("%I64d\n",(ans*6)%mod);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值