Table CodeForces - 232B(144 div1 B) (dp+快速幂)
2017-08-15 08:13
567 查看
链接:http://codeforces.com/problemset/problem/232/B
题意:给出一个n*m的大矩阵(m>=n),往矩阵里放点,求满足对于每一个n*n的小矩阵都有k个点的放法的数量。
解题思路:
![](https://img-blog.csdn.net/20170814210234606?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2R1dDE2c3px/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
对于一个n*n的矩阵S1 A为其左边一列中的点的个数, B为S2右边一列中的点的个数, 于是有A+T=B+T ,故当第一个n⋅n 矩阵中第i列的点的个数确定时,第n+i, n+2*i….点的个数都会被确定, 于是问题转化为求第一个n*n矩阵中每一列的点的个数 ,记dp[i][j]为当到第i列时共确定了j个点, 则不难推出dp[i][j]=∑min(n,j)x=0dp[i−1][j−x]⋅Cxn , 用语言描述就是第i列确定j个点这种情况是由第i-1列确定j-x个点乘在n个点中挑选x个点的情况数,当然这里的Cxn要考虑到对后面第n+i, n+2*i….点的影响。
代码:
题意:给出一个n*m的大矩阵(m>=n),往矩阵里放点,求满足对于每一个n*n的小矩阵都有k个点的放法的数量。
解题思路:
对于一个n*n的矩阵S1 A为其左边一列中的点的个数, B为S2右边一列中的点的个数, 于是有A+T=B+T ,故当第一个n⋅n 矩阵中第i列的点的个数确定时,第n+i, n+2*i….点的个数都会被确定, 于是问题转化为求第一个n*n矩阵中每一列的点的个数 ,记dp[i][j]为当到第i列时共确定了j个点, 则不难推出dp[i][j]=∑min(n,j)x=0dp[i−1][j−x]⋅Cxn , 用语言描述就是第i列确定j个点这种情况是由第i-1列确定j-x个点乘在n个点中挑选x个点的情况数,当然这里的Cxn要考虑到对后面第n+i, n+2*i….点的影响。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define LL long long using namespace std; const int MOD = 1e9 + 7; const int Max = 120; LL C[Max][Max]; LL Z[Max][Max]; LL dp[Max][15000]; void get_combinations() {//递推求出组合数 for (int a = 1; a <= 100; a++) { C[a][0] = C[a][a] = 1; for (int b = 1; b < a; b++) { C[a][b] = (C[a - 1][b - 1] + C[a - 1][b]) % MOD;//对于某一个点如果确定取则为 C[a - 1][b - 1], 确定不取为C[a - 1][b] } } } LL pow_MOD(LL n, LL m) {//快速幂 LL ans = 1; while (m) { if (m & 1)ans = (ans * n) % MOD; n = (n * n) % MOD; m >>= 1; } return ans; } int main() { LL n, m, k; get_combinations(); scanf("%lld%lld%lld", &n, &m, &k); for (LL a = 1; a <= n; a++) {//确定在第a列取b个数会对后面的影响 for (LL b = 0; b <= n; b++) {//当m%n后剩下的数仍够a则会影响后面m/n+1列,否则影响m/n列 Z[a][b] = pow_MOD(C [b], m / n + + (m % n >= a)); } } dp[0][0] = 1; for (LL a = 1; a <= n; a++) {//对于第a行时一共确定了b个点的状态 for (LL b = 0; b <= min(k, n * a); b++) { for (LL c = 0; c <= min(b, n); c++) { dp[a][b] = (dp[a][b] + dp[a - 1][b - c] * Z[a][c]) % MOD; } } } printf("%lld\n", dp [k]); return 0; }
相关文章推荐
- 【Codeforces Round #196 (Div. 1)】Codeforces 338D GCD Table
- CodeForces 232 B.Table(dp+组合数学)
- codeforces 的 Codeforces Round #273 (Div. 2) --C Table Decorations
- Codeforces Round #144 (Div. 1), problem: (B) Table DP 组合数学
- Codeforces 583 DIV2 GCD Table 贪心
- codeforces水题100道 第十八题 Codeforces Round #289 (Div. 2, ACM ICPC Rules) A. Maximum in Table (brute force)
- codeforces 311(div2)C-Arthur and Table
- codeforces 891-A. Pride Codeforces Round #446 (Div. 2) C. Pride
- Codeforces #277.5 (Div. 2) B. BerSU Ball(DP:LCS)
- DIV和Table的水平、垂直居中方法
- div 模仿table的左右布局
- CodeForces 602B Approximating a Constant Range(方法很多,不想费脑子就上线段树)——Codeforces Beta Round #333 (Div. 2)
- [二分答案 2-SAT验证 前后缀优化建图] Codeforces 587D #326 (Div. 1) D. Duff in Mafia
- div与table
- Div与table的区别
- codeforces 338D GCD Table
- 问题:table 可否实现对角线;结果:用div+css模拟表格对角线
- table标签中不能有div、span等标签,不然有些浏览器中是不对的
- [转自blueidea]像table一样布局div Ⅰ
- codeforces 260 div2 C题