N排列盒子涂色方法总和 DP SRM 666 div1 medium SumOverPermutations
来源:互联网 发布:知乎页面改版 编辑:程序博客网 时间:2024/06/05 05:05
SumOverPermutations
http://community.topcoder.com/stat?c=problem_statement&pm=13764&rd=16515
题解摘自http://www.cnblogs.com/HarryGuo2012/p/4777063.html
题意:
有个奇葩,组合数学很渣,老师问他:无限个n种颜色的球放在n个有顺序的盒子中,每个盒子放一个,相邻盒子的球的颜色不同,有多少种方法。这个奇葩给了个奇葩的解答,他说这和放的顺序有关,比如有三个盒子,三种颜色的球,若放的顺序是 1 2 3,那么答案就是3×2×2,若放的顺序是 1 3 2,那么答案就是3×3×1。更一般的,他认为,若一个位置的左侧和右侧都被放了,那么现在有(n-2)种可能性,若只有一侧被放了,那么有(n-1)种可能性,若两侧都没放,那么有n种可能性。我们知道这是明显错误的,但是,题目就是问你,给你个n,这n!种放的顺序按照这个奇葩的算法得到的答案是多少。
题解:
令
一种是将第
另外一种是将第
所以总的转移是
答案显然是
long long dp[MAX_N];long long mod=1000000007;long long C[MAX_N][MAX_N];class SumOverPermutations{ public: int findSum(int n) { C[0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=i;j++) C[i][j]=(j==0?1:C[i-1][j-1]+C[i-1][j])%mod; dp[1]=n%mod; dp[2]=n%mod*(n-1)%mod*2%mod; for(int i=3;i<=n;i++){ dp[i]=2%mod*(n-1)%mod*dp[i-1]%mod; for(int j=1;j<=i-2;j++) dp[i]=(dp[i]+C[i-1][j]%mod*dp[j]%mod*dp[i-j-1]%mod*(n-2)%mod)%mod; } return dp[n]%mod; }};
0 0
- N排列盒子涂色方法总和 DP SRM 666 div1 medium SumOverPermutations
- SRM 719 div1 Medium (树形dp)
- [DP套DP] SRM 591 div1 StringPath
- srm 556 div1 500 LeftRightDigitsGame2(DP)
- srm 181 div1 1000(状压dp)
- Topcoder SRM 662 Div1, ExactTree,DP
- [树形DP 杂题] SRM 562 div1 InducedSubgraphs
- Topcoder SRM 651 div1 250 题解 (概率dp)
- TopCoder SRM 667 Div1 Problem 250 - OrderOfOperations (状压dp)
- 有向图判环+拆解图求参会期望 SRM 660 Div1 Medium: Privateparty
- SRM 465(DIV1 DIV2)
- SRM 465(DIV1 DIV2)
- SRM 144 DIV1 second
- SRM 507 DIV1 B
- SRM 513 DIV1 C
- SRM 500 DIV1 B
- 1-SRM 144 DIV1
- TC SRM 559 DIV1
- POJ 1236 Network of Schools(强连通分量缩点)
- ajax
- Android程序中实现按钮按下后的界面跳转
- java设计模式系列--简单工厂模式
- 密码学的对称加密和不对称加密有哪些和各自特点
- N排列盒子涂色方法总和 DP SRM 666 div1 medium SumOverPermutations
- POJ 3113 Manhattan Wiring(插头DP)
- 第二周项目零,宣告“主权”
- Rust and Go
- 一个例子说明如何在DataSnap中使用FireDAC
- 微信开发如何做本地调试?
- java数组
- Android 百分比布局支持库使用
- MSCcomm控件出现ASSERT错误