HHKB Programming Contest 2020 D - Squares 题解(思维)

题目链接

题目大意

给你一个边长为n的正方形和边长为a和b的正方形,要求把边长为a和b的正方形放在长度为n的正方形内,且没有覆盖(可以相邻)求有多少种放法(mod 1e9+7)

题目思路

这个思路不是很容易想

假设a正方形在b正方形左边

那么只考虑纵坐标,还剩下n-a-b个空格,根据插空法则有C(n-a-b+1,2)种方法,然而需要注意可以这两个三角形可以插在一个空格里面则要加n-a-b+1,则总方案为C(n-a-b+2,2)然后考虑横坐标,那么a正方形有(n-a+1)种方法,b三角形有(n-b+1)种放法

那么总共可以有\(C(n-a-b+1,2)*(n-a+1)*(n-b+1)\)

还可以让a在b右边,上面,下面。由于是正方形所以直接答案✖4

但是你会发现会有重复的,为什么有的即是他的左边也是他的上面即同时满足两个条件的...

就是满足两个条件即\(C(n-a-b+1,2)*C(n-a-b+1,2)\)

显然也需要乘以4

那么ans=\(4*(C(n-a-b+1,2)*(n-a+1)*(n-b+1)-C(n-a-b+1,2)*C(n-a-b+1,2))\)

注意取模即可

代码

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
//#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const double pi=acos(-1);
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=2e3+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-10;
ll n,a,b; 
signed main(){
  	int _;scanf("%d",&_);
	while(_--){
	  	scanf("%lld%lld%lld",&n,&a,&b);
	  	if(n<a+b){
	  		printf("0\n");	
		}else{
			ll ans1=2*(n-a-b+2)%mod*(n-a-b+1)%mod*(n-a+1)%mod*(n-b+1)%mod;
			ll ans2=(n-a-b+2)*(n-a-b+1)%mod*(n-a-b+2)%mod*(n-a-b+1)%mod;
			printf("%lld\n",((ans1-ans2)%mod+mod)%mod);	
		}
	} 
    return 0;
}

posted @ 2020-10-13 21:54  hunxuewangzi  阅读(79)  评论(0编辑  收藏  举报