A:题意密码由n不同的字符和m的长度组成,问你有多少种情况
解题思路:可以得到状态转移方程为 dp[i][j] = dp[i-1][j]*j + dp[i-1][j-1]*(n-j+1);
解题代码:
1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年09月15日 星期一 14时29分39秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 LL dp[200][200]; 28 #define M 1000000007 29 int main(){ 30 freopen("out","w",stdout); 31 int t; 32 scanf("%d",&t); 33 for(int ca = 1; ca <= t; ca ++) 34 { 35 int n , m ; 36 scanf("%d %d",&n,&m); 37 memset(dp,0,sizeof(dp)); 38 dp[1][1] = n; 39 for(int i = 2;i <= m;i ++) 40 { 41 for(int j = 1;j <= n;j ++) 42 dp[i][j] = (dp[i-1][j] *j)%M + dp[i-1][j-1]*(n-j+1)%M ; 43 } 44 printf("Case #%d: %lld ",ca,dp[m][n]%M); 45 } 46 return 0; 47 }