Codeforces 214D Numbers【思维+Dp】
来源:互联网 发布:阳光灿烂的日子知乎 编辑:程序博客网 时间:2024/06/15 19:57
题目大意:
让我们计算有多少种构造方式 ,使得数字串(不能有前导0)长度小于等于n,并且0~9的每个数字至少使用了a【i】个。
思路:
我们设定Dp【i】【j】表示长度为i,从数字9开始倒着插入数字,现在插到数字j的构造方案数。
那么有:
Dp【i】【j】=ΣDp【i-k】【j+1】*C(j,k);
注意一下j==0的情况,特判一下不能有前导0即可。
Ac代码:
#include<stdio.h>#include<string.h>using namespace std;#define LL long long intconst LL mod = 1000000000+7;const LL N = 300000+5;const LL M = 3e5+3;LL fac[1000005]; //阶乘LL inv_of_fac[1000005]; //阶乘的逆元LL qpow(LL x,LL n){ LL ret=1; for(; n; n>>=1) { if(n&1) ret=ret*x%mod; x=x*x%mod; } return ret;}void init(){ fac[1]=1; for(int i=2; i<=M; i++) fac[i]=fac[i-1]*i%mod; inv_of_fac[M]=qpow(fac[M],mod-2); for(int i=M-1; i>=0; i--) inv_of_fac[i]=inv_of_fac[i+1]*(i+1)%mod;}LL C(LL a,LL b){ if(b>a) return 0; if(b==0) return 1; return fac[a]*inv_of_fac[b]%mod*inv_of_fac[a-b]%mod;}int a[15];LL dp[150][12];int main(){ init(); int n; while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); for(int i=0;i<=9;i++)scanf("%d",&a[i]); for(int i=a[9];i<=n;i++)dp[i][9]=1; for(int i=8;i>=0;i--) { for(int j=0;j<=n;j++) { for(int k=a[i];k<=j;k++) { if(i!=0)dp[j][i]=(dp[j][i]+dp[j-k][i+1]*C(j,k))%mod; else if(i==0&&j>k) { dp[j][i]=(dp[j][i]+dp[j-k][i+1]*C(j-1,k))%mod; } } } } LL ans=0; for(int i=0;i<=n;i++)ans=(ans+dp[i][0])%mod; printf("%I64d\n",ans); }}
阅读全文
0 0
- Codeforces 214D Numbers【思维+Dp】
- CodeForces 55D. Beautiful numbers (思维+数位DP)
- Codeforces 55D Beautiful numbers 数位dp
- Codeforces 55D Beautiful numbers --- 数位DP
- Codeforces 55D Beautiful numbers 数位dp
- 【codeforces】55D. Beautiful numbers 数位DP
- [CodeForces 55D] Beautiful numbers && 数位DP
- Codeforces 55D Beautiful numbers 数位DP
- 【数位DP】 Codeforces 55D Beautiful numbers
- codeforces 55D Beautiful numbers[数位dp]
- [Codeforces 55D]Beautiful numbers(数位DP)
- CodeForces 55D Beautiful numbers (数位DP)
- Codeforces 55D Beautiful numbers【数位dp】
- Codeforces 628D Magic Numbers 【数位dp】
- codeforces 55D. Beautiful numbers (数位dp)
- CodeForces 55D Beautiful numbers(数位dp)
- codeforces-55D-Beautiful numbers(数位DP)
- codeforces 55D Beautiful numbers 数位dp
- Linux dd 命令
- 第一个QNX程序(Run)
- 开机自启动
- angularjs的聚焦行为
- 【Java EE】Eclipse项目 部署路径问题
- Codeforces 214D Numbers【思维+Dp】
- android 实现多级文件夹树界面(带线条)
- [IOS开发]判断设备型号
- 超详细 Java使用freemarker模板技术导出word
- webrtc中YUV红蓝反色-------反转方式
- 就鹿晗宣布恋情导致微博宕机事件浅谈大型网站高可用性架构
- 刷新你三观!这些堪比软件的神网站你知多少
- java总结1003
- Spark-sql执行部分语句是报错:WARN org.apache.spark.scheduler.TaskSchedulerImpl: Initial job has not accepted a