7_4_L题 Cheerleaders 题解[uva 11806](容斥)

来源:互联网 发布:我要开淘宝网店怎么开 编辑:程序博客网 时间:2024/06/05 08:09

题目链接

简单题意

有个n*m的矩阵,在其中放置k个拉拉队员,要求四边上都至少有一个,求有多少种放法。

思路

容斥定理,
全部的放法有Cknm,
有一条边没有的放法有Ck(n1)mCkn(m1)
有两条边没有的放法有Ck(n1)(m1)Ckn(m2)Ck(n2)m
有三条边没有的放法有Ck(n2)(m1)Ck(n1)(m2)
四条边上都没有的放法有Ck(n2)(m2)

然后用容斥定理加减一下就可以了

代码

#include <cstdio>#include <string>#include <cmath>#include <iostream>using namespace std;typedef long long ll;const int maxn = 505;const ll mod = 1e6+ 7;ll dp[maxn][maxn];void init (){    for(int i = 0 ; i < maxn ; i ++){        dp[i][0] = 1;        dp[i][i] = 1;    }    for(int i = 0 ; i < maxn ; i ++){        for(int k = 1 ; k < i ; k ++){            dp[i][k] = dp[i-1][k] + dp[i-1][k-1];            dp[i][k] %= mod;        }    }}ll C(int n,int m){    return dp[n][m];}int main(){    init();    int T;    scanf("%d", &T);    int kas = 1;    while(T --){        int n,m,k;        scanf("%d %d %d", &n,&m,&k);        int  ans = C(n*m,k);        ans = (ans - C(n*(m-1),k) + mod) %mod;        ans = (ans - C(n*(m-1),k) + mod) %mod;        ans = (ans - C(m*(n-1),k) + mod) %mod;        ans = (ans - C(m*(n-1),k) + mod) %mod;        ans = (ans + C((n-1)*(m-1),k)) %mod;        ans = (ans + C((n-1)*(m-1),k)) %mod;        ans = (ans + C((n-1)*(m-1),k)) %mod;        ans = (ans + C((n-1)*(m-1),k)) %mod;        ans = (ans + C((n)*(m-2),k)) %mod;        ans = (ans + C((n-2)*(m),k)) %mod;        ans = (ans - C((n-2)*(m-1),k) + mod) %mod;        ans = (ans - C((n-2)*(m-1),k) + mod) %mod;        ans = (ans - C((n-1)*(m-2),k) + mod) %mod;        ans = (ans - C((n-1)*(m-2),k) + mod) %mod;        ans = (ans + C((n-2)*(m-2),k) + mod) %mod;        printf("Case %d: %d\n",kas++,ans);    }    return 0;}
0 0
原创粉丝点击