7_4_L题 Cheerleaders 题解[uva 11806](容斥)
2016-07-06 20:27
447 查看
题目链接
全部的放法有Ckn∗m,
有一条边没有的放法有Ck(n−1)∗m和Ckn∗(m−1)
有两条边没有的放法有Ck(n−1)∗(m−1)和Ckn∗(m−2)和Ck(n−2)∗m
有三条边没有的放法有Ck(n−2)∗(m−1)和Ck(n−1)∗(m−2)
四条边上都没有的放法有Ck(n−2)∗(m−2)
然后用容斥定理加减一下就可以了
简单题意
有个n*m的矩阵,在其中放置k个拉拉队员,要求四边上都至少有一个,求有多少种放法。思路
容斥定理,全部的放法有Ckn∗m,
有一条边没有的放法有Ck(n−1)∗m和Ckn∗(m−1)
有两条边没有的放法有Ck(n−1)∗(m−1)和Ckn∗(m−2)和Ck(n−2)∗m
有三条边没有的放法有Ck(n−2)∗(m−1)和Ck(n−1)∗(m−2)
四条边上都没有的放法有Ck(n−2)∗(m−2)
然后用容斥定理加减一下就可以了
代码
#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 [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; }
相关文章推荐
- 打印机一直正在删除
- JAVA中多线程初体验
- MySql5.6Linux安装后my.cnf配置文件位置
- gcc的优化选项
- Android 复习4 神奇的问题 杂谈
- Android LayoutInflate(一)
- POJ2823 Sliding Window
- 企业架构,业务架构,数据架构
- MYSQL 优化的笔记
- Java反射获取类和对象
- 如何安装Java环境
- 如何在简历中编写Spark大数据项目经验
- hrbust 1332 MM买电脑【二分查找+贪心】
- ubuntu 查看jdk位置
- 认识Linux
- POI
- WIN32 API串口通信编程
- [Java之余]在人群中间,在阳光之下
- Android Studio中找不到模拟器
- 5-17 爬动的蠕虫 (15分)