容斥原理-shuoj—小明系列之高中时光

2 篇文章 0 订阅
1 篇文章 0 订阅

Description

小明是一个聪明的小孩,虽然初中没有前三年学习成绩都很差。但是凭借这中考前最后几个月的冲刺还是考进了一所离家里比较近的普通高中。刚进入高中小明对课堂上老师讲授的问题依然没有什么兴趣。但是小明的聪明头脑依然不会停止转动。平时只要一闲下来就会去思考一些有趣的数学问题。今天小明学校开运动会,小明和他的同学们都坐在操场上观看开幕仪式。爱思考的小明又闲不住了,正好小明身边有k个石子,小明又在地板上画了一个m行n列的矩形网格,问题是有多少种方法可以将这k个石子放进网格里?现在要你写程序计算这个问题,看看你能不能借助计算机的力量算的比小明快。每个格子最多放一个石子,所有的石子必须用完,另外小明为了加大难度又加了一个条件:第一行、最后一行、第一列、最后一列都得有石子。

Input

输入第一行为数据组数T(T<=50),每组数据包含三个整数m,n,k(2<=m,n<=20,k<=500)。输入数据至文件结尾。

Output

对于每组数据输出一行,方案总数除以1000007的余数。

Sample Input

22 2 12 3 2

Sample Output

02

题解:
容斥原理(p(A+B) = p(A) + P(B) - P(AB))  (百度链接,点击打开链接)。

组合数 (百度链接 点击打开链接

本题主要运用了容斥原理和求组合数(组合数链接,点击打开链接)。

现在具体分析这道题。

四个边上都有点的组合  =  总组合数  -  四个边中至少有一个边没有点的组合数。

将问题转化成 求:四个边中至少有一个边没有点的组合数

用数组 dp[ i ][ j ]来保存组合数C(i  ,  j)。

由容斥原理:

设A=  上边没点
    B = 下边没点
    C = 左边没点
    D = 右边没点
四个边中至少有一个边没有点  =  A + B +  C  + D -AB - AC - AD  - BC - BD  -CD + ABC + ABD + ACD + BCD - ABCD

分别求出上述独立事件的组合数即为最终结果。



代码如下:
#include<bits/stdc++.h>
using namespace std;
const int mod = 1000007;
long long dp[405][405];

//将组合数打表
void com(){
    memset(dp,0,sizeof(dp));
    dp[0][0] = 1;
    dp[1][0] = 1;
    dp[1][1] = 1;
    for(int i = 2;i<401;i++){
        for(int j = 0;j<=i;j++){
            if(j == 0||j == i)dp[i][j] = 1;
            else dp[i][j] = (dp[i-1][j-1]+dp[i-1][j])%mod;
        }
    }
}
int main(){
    com();
    int T;
    cin>>T;
    while(T--){
        int m,n,k;
        cin>>m>>n>>k;
         if(k<2||k>m*n)
        {
            cout<<0<<endl;
            continue;
        }
      long long sum;
      sum = (dp[n*m][k] - 2*dp[(n-1)*m][k] - 2*dp[n*(m-1)][k]+mod)%mod;
      while(sum<0)sum+=mod;
      sum = (sum + dp[(n-2)*m][k] + dp[(m-2)*n][k] + 4 * dp[(n-1)*(m-1)][k])%mod;
      while(sum<0)sum+=mod;
      sum = (sum - 2*dp[(n-2)*(m-1)][k] - 2*dp[(m-2)*(n-1)][k]+mod)%mod;
      while(sum<0)sum+=mod;
      sum = (sum + dp[(n-2)*(m-2)][k])%mod;
      while(sum<0)sum+=mod;
        cout<<sum<<endl;
    }
谢谢!
201812-2小明放学的问题是关于小明利用“智慧光明”终端给出的信息,估算自己放学回家的时间。在这道题目中,小明已经规划好了回家的路线,并能够预测经过各个路段的时间。此外,小明还能够看到出发时刻路上经过的所有红绿灯的指示状态。根据题目的描述,我们可以推导出小明此次回家所需要的时间。 首先,题目给出了红绿灯的设置,包括红灯、黄灯和绿灯分别需要的时间。接下来,题目给出了小明经过的道路段数和路过的红绿灯数目。然后,题目给出了每个道路段和红绿灯的状态,包括经过的道路需要的时间和红绿灯的状态以及倒计时显示的数字。 根据题目的要求,我们需要不断地推演现在的时间下新经过的红绿灯状态。可以将红灯和黄灯放在一起,因为这两个状态下都得等待,然后将绿灯状态单独分开。这样就将问题简化为两个区间,即红黄和绿。通过计算每个区间所需的时间,就可以得到小明放学回家所用的总时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [CCF 201812-2----小明放学----区间问题](https://blog.csdn.net/weixin_44778155/article/details/101158855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值