博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lightoj 1226 - One Unit Machine(dp+大组合数去摸)
阅读量:4313 次
发布时间:2019-06-06

本文共 1426 字,大约阅读时间需要 4 分钟。

题目链接:

 

题解:由于这些任务完成是有先后的所以最后一个完成的肯定是最后一个任务的子任务,不妨设dp[i]表示第几个任务完成后总共有几种方案,这里要逆着来至于为什么想想也是挺好理解的。于是有这么一个方程式dp[i]=dp[i + 1]*C(sum-1,k[i]-1),这样列出来就更好理解了。就是最后一个位置肯定是确定的之后就靠组合来凑。

#include 
#include
#include
#define mod 1000000007using namespace std;typedef long long ll;const int M = 1234;ll k[M];ll dp[M] , Po[1234567];ll mod_pow(ll a , ll b) { ll res = 1; while(b) { if(b & 1) res = (res * a) % mod; a = (a * a) % mod; b >>= 1; } return res;}ll C(ll n , ll m) { if(n < m) return 0; if(!m || !n) return 1; ll res = (Po[n] * mod_pow(Po[m] * Po[n - m] % mod , mod - 2)) % mod; return res;}int main() { int t , n; scanf("%d" , &t); int Case = 0; Po[0] = 1; for(int i = 1 ; i < 1234567 ; i++) { Po[i] = Po[i - 1] * i % mod; Po[i] %= mod; } while(t--) { memset(dp , 0 , sizeof(dp)); scanf("%d" , &n); ll sum = 0; for(int i = 1 ; i <= n ; i++) { scanf("%lld" , &k[i]); sum += k[i]; } dp[n] = C(sum - 1 , k[n] - 1); dp[n] %= mod; sum -= k[n]; for(int i = n - 1 ; i >= 1 ; i--) { dp[i] = dp[i + 1] * C(sum - 1 , k[i] - 1) % mod; dp[i] %= mod; sum -= k[i]; } printf("Case %d: %lld\n" , ++Case , dp[1]); } return 0;}

 

转载于:https://www.cnblogs.com/TnT2333333/p/7656581.html

你可能感兴趣的文章
ShuffleNet总结
查看>>
前后台验证字符串长度
查看>>
《算法导论 - 思考题》7-1 Hoare划分的正确性
查看>>
IOS 简单的动画自定义方法(旋转、移动、闪烁等)
查看>>
图像处理笔记(十二)
查看>>
Chapter 3 Phenomenon——9
查看>>
win64 Python下安装PIL出错解决2.7版本 (3.6版本可以使用)
查看>>
获取各种类型的节点
查看>>
表达式求值-201308081712.txt
查看>>
centos中安装tomcat6
查看>>
从Vue.js窥探前端行业
查看>>
学习进度
查看>>
poj3368 RMQ
查看>>
“此人不存在”
查看>>
github.com加速节点
查看>>
解密zend-PHP凤凰源码程序
查看>>
python3 序列分片记录
查看>>
Atitit.git的存储结构and 追踪
查看>>
atitit 读书与获取知识资料的attilax的总结.docx
查看>>
B站 React教程笔记day2(3)React-Redux
查看>>