题意:从m种字母中选取字母组成姓名,要求姓和名中不能有相同的字母,姓和名的长度都为n,问能组成几种不同的姓名。

分析:

1、从m种字母中选取i种组成姓,剩下m-i种组成名。

2、i种字母组成长度为n的姓-----可转换成用i种颜色给n个球染色,记忆化搜索

dfs(n,i)---用i种颜色给n个球染色的方案数

先给第1个小球涂色,有m种选择,假设涂色为color[1],

那么剩下n-1个小球:

如果继续使用color[1],则问题转化为用m种颜色给n-1个小球涂色;

如果不再使用color[1],则问题转化为用m-1种颜色给n-1个小球涂色;

因此,dfs(n,i) = m * (dfs(n - 1, m - 1) + dfs(n - 1, m))。

3、m-i种字母组成长度为n的名,名字中每个字母有m-i种选择,因此方案数为(m - i)n

4、由此可列式:C[m][i] * dfs(n, i) * POW_MOD(m - i, n)   (1<=i<=min(n,m))

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const LL MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 2000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
LL C[MAXN][MAXN];//组合数
LL A[MAXN];//阶乘
LL dp[MAXN][MAXN];
void init(){
A[1] = 1;
for(int i = 0; i < MAXN; ++i){
C[i][0] = C[i][i] = 1;
if(i > 1) A[i] = A[i - 1] * i % MOD;
for(int j = 1; j < i; ++j){
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
}
}
}
LL dfs(LL n, LL m){
if(dp[n][m]) return dp[n][m];
if(n == m) return dp[n][m] = A[n];
if(m == 1) return dp[n][m] = 1;
return dp[n][m] = m * ((dfs(n - 1, m - 1) + dfs(n - 1, m)) % MOD) % MOD;
}
LL POW_MOD(LL n, LL m){
if(m == 0) return 1;
LL tmp = POW_MOD(n, m / 2);
LL ans = tmp * tmp % MOD;
if(m & 1) (ans *= n) %= MOD;
return ans;
}
int main(){
int T;
scanf("%d", &T);
init();
while(T--){
LL n, m;
scanf("%lld%lld", &n, &m);
LL ans = 0;
for(LL i = 1; i <= min(n, m); ++i){
(ans += ((C[m][i] * dfs(n, i)) % MOD) * POW_MOD(m - i, n) % MOD) %= MOD;
}
printf("%lld\n", ans);
}
return 0;
}

HDU - 6143 Killer Names(dp记忆化搜索+组合数)的更多相关文章

  1. HDU 6143 Killer Names DP+快速密

    Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human apprentice ...

  2. HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8

    /* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...

  3. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  4. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  5. !HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)

    题意:有一个n*n的格子.每一个格子里有不同数量的食物,老鼠从(0,0)開始走.每次下一步仅仅能走到比当前格子食物多的格子.有水平和垂直四个方向,每一步最多走k格,求老鼠能吃到的最多的食物. 分析: ...

  6. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  7. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  8. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  9. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

随机推荐

  1. js 判断时间大小

    //判断结束时间一定要大于开始时间 function comparativeTime(){ var isok=true; //早餐配送时间 var breakfastScanTimeMin = $(& ...

  2. Vue源码(上篇)

    某课网有个488人名币的源码解读视频看不起,只能搜很多得资料慢慢理解,看源码能知道大佬的功能模块是怎么分块写的,怎么复用的,已经vue是怎么实现的 资料来自 vue源码 喜欢唱歌的小狮子 web喵喵喵 ...

  3. scrapy 开发流程

    一.Spider 开发流程 实现一个 Spider 子的过程就像是完成一系列的填空题,Scrapy 框架提出以下问题让用户在Spider 子类中作答: 1.爬虫从哪个或者那些页面开始爬取? 2.对于一 ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:悬停表格

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. [网络必学]TCP/IP四层模型讲解【笔记整理通俗易懂版】

    OSI七层模型     表示层:用来解码不同的格式为机器语言,以及其他功能. 会话层:判断是否需要网络传输. 传输层:识别端口来指定服务器,如指定80端口的www服务. 网络层:提供逻辑地址选路,即发 ...

  6. 【剑指Offer面试编程题】题目1515:打印1到最大的N位数--九度OJ

    题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例. 对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1 ...

  7. CTU Open Contest 2019 AB题

    小菜鸡飘过 A: Beer Barrels 题意:给出四个整数:A,B,K,C,:A,B,C都是大于0的个位数,问在所有仅有A或者B组成的K位数中,数字C的个数是多少 思路: 1.先考虑特殊情况: ( ...

  8. [c#]如何访问 JArray 的元素

    JArray 格式文件. public void TestJson() { var jsonString = @"{""trends"": [ { & ...

  9. Mybatis入门(一)环境搭建

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  10. LeetCode 297.序列化二叉树 - JavaScript

    题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法 ...