zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    单源最短路径-邻接表无向网络
    带权邻接表图的最小生成树
    邻接矩阵有向图的广度优先遍历
    邻接表无向图的深度优先遍历
    图基础-创造用于测试的简单图
    用EFCore从mssql数据库生成实体类
    使用EF Core访问SqlServer数据库
    哈夫曼树综合练习
    树形结构例--控制台显示文件夹结构
    Java之设计模式
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/13811626.html
Copyright © 2011-2022 走看看