• HHKB Programming Contest 2020 D


    题目链接

    题目大意

    给你一个边长为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
    ");
    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
    ");	
    		}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
    ",((ans1-ans2)%mod+mod)%mod);	
    		}
    	} 
        return 0;
    }
    
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    TC SRM 591 (Div2. Practice only)
    SDL2 简单实现图片缩放移动查看
    Linux下socket编程 address already in use 问题
    POJ 2155 二维树状数组
    OJ开发笔记(1)
    开通博客啦~
    [转]STL transform算法中使用toupper函数
    Monkey and Banana HDU 1069
    Ignatius and the Princess IV HDU 1029
    Dungeon Master POJ 2251
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/13811626.html
Copyright © 2020-2023  润新知