hdu 6143 Killer Names
来源:互联网 发布:淘宝网西服 编辑:程序博客网 时间:2024/05/22 09:39
Problem
acm.hdu.edu.cn/showproblem.php?pid=6143
Meaning
克隆人的名字分成 first name 和 last name,相同字母不能同时出现在两边,但可以多次出现在同一边。
现有 m 种字母, 要起 first name 和 last name 都是长为 n 的名字,求有个多少种符合要求的方案。
Analysis
分开考虑排字母的方案和选字母的方案。
首先是 first / last name 的排字母方案: dp[i][j] = 用恰好 j 种字母填长度为 i 的 (first / last)name 的方案
考虑在最后新加一格来放字母,则可以放已有的字母,或新的字母,则有转移: dp[i+1][j] += j * dp[i][j]
和 dp[i+1][j+1] += dp[i][j]
;
或者写成: dp[i][j] = j * dp[i-1][j] + dp[i-1][j-1]
。
再考虑选字母方案:若 first name 选 a 种字母,则选法有
把选字母方案数和排字母方案数相成就是完整的方案数。另一边 last name 也是类似。
枚举 first name 和 last name 的用字母个数,把两边的方案数相乘加到答案里。
Code
#include <cstdio>#include <algorithm>using namespace std;const int N = 2000, M = N, MOD = 1000000007;long long dp[N+1][M+1] = {{1}}, A[N+1][N+1];void init(){ for(int i = 1; i <= N; ++i) { A[i][1] = i; for(int j = 2; j <= i; ++j) A[i][j] = A[i][j-1] * (i - j + 1) % MOD; } for(int i = 0; i < N; ++i) for(int j = 0; j <= i; ++j) { dp[i+1][j] = (dp[i+1][j] + j * dp[i][j]) % MOD; dp[i+1][j+1] = (dp[i+1][j+1] + dp[i][j]) % MOD; }}int main(){ init(); int T; scanf("%d", &T); while(T--) { int n, m; scanf("%d%d", &n, &m); long long ans = 0; for(int i = 1, I = min(n, m - 1); i <= I; ++i) for(int j = 1, J = min(n, m - i); j <= J; ++j) ans = (ans + A[m][i] * dp[n][i] % MOD * A[m-i][j] % MOD * dp[n][j]) % MOD; printf("%lld\n", ans); } return 0;}
阅读全文
0 0
- HDU 6143 Killer Names
- hdu--6143--Killer Names
- hdu 6143 Killer Names
- hdu 6143 Killer Names
- HDU 6143 Killer Names
- hdu 6143 Killer Names
- HDU 6143 Killer Names
- HDU --6143 Killer Names
- hdu 6143 Killer Names dp
- Killer Names(hdu 6143)
- Killer Names(HDU 6143)
- HDU 6143 Killer Names [第二类斯特林数]
- HDU 6143 Killer Names (容斥)
- hdu 6143 Killer Names(容斥原理)
- Hdu 6143 Killer Names【思维+斯特灵数】
- HDU 6143 Killer Names(dp 思维)
- HDU 6143 Killer Names(dp+容斥)
- HDU 6143 Killer Names(容斥)
- 01.Lua笔记_基础语法部分
- 1032. 挖掘机技术哪家强(20)
- Caffe学习笔记——Caffe的三级结构(Blobs,Layers,Nets)
- sublime插件推荐
- SSM 增、删(ajax)
- hdu 6143 Killer Names
- dp day2/3-区间dp
- c++ c# opencv dll 调用的方法
- angular4小星星评分功能代码
- 面向对象的第一个特征:封装II
- POJ
- Caffe中卷积的实现细节(涉及到BaseConvolutionLayer、ConvolutionLayer、im2col等)
- unique去重函数
- 根据数组中某个两个值作为键、并把数组中同时存在该两个字段值的数组值累加、组合成三维数组