Codeforces Round #131 (Div. 1) B. Numbers
来源:互联网 发布:阿里云elb 编辑:程序博客网 时间:2024/04/30 10:18
题意
统计这样的数字有多少个:
1、这个数的长度不超过 n(1<=n<=100)
2、这个数不能含有前导 0
3、数字 i(0<=i<=9) 在这个数中至少出现 a[i](0<=a[i]<=100) 次
做法分析
组合数学?我觉得还是用动态规划的眼光来看他算了。
可以这样划分阶段:我们把数字 1~8 先处理了,因为 0 不能做前导,所以我们最后来单独的处理它。阶段就是 用 i~9 这几个数字组成长度不超过 n,且 i~9 中每个数字在这种数中至少出现各自对应的最少出现次数。状态就可以这样定义了: f[i][L]:用后面 9~i 这几个数组成满足条件的数的种类,转移方程如下:
f[i][L]=sigma{ f[i+1][L-k]*C[L][k] }
f[i][L]=sigma{ f[i+1][L-k]*C[L][k] }
C[L][k] 表示的是:把 k 个相同的数 i 插入到长度 L-k 中,产生的新数的种类数量,也就是从 L 个数中选取 k 个数的组合数
需要注意的是:在算 C[i][j] 的时候,由于采用的是递推:C[i][j]=C[i-1][j]+C[i-1][j-1] ,在 j==0 的时候需要特殊处理下,因为这里,WA惨了
AC通道
Codeforces Round #131 (Div. 1) B. Numbers
参考代码
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int INT_INF=0x3fffffff;const int MOD=1000000007;typedef long long LL;int a[20];LL f[24][205], C[205][205];int main(){memset(C, 0, sizeof(C));C[0][0]=1;for(int i=1; i<205; i++)for(int j=0; j<=i; j++)if(j==0) C[i][j]=1;else C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;int n; cin>>n;for(int i=0; i<10; i++)cin>>a[i];memset(f, 0, sizeof(f));f[10][0]=1;for(int i=9; i>0; i--)for(int j=0; j<=n; j++)for(int k=a[i]; k<=j; k++)f[i][j]=(f[i][j]+f[i+1][j-k]*C[j][k])%MOD;LL ans=0;for(int i=0; i<=n; i++)for(int j=a[0]; j<i; j++)ans=(ans+f[1][i-j]*C[i-1][j])%MOD;cout<<ans<<endl;return 0;}
- Codeforces Round #131 (Div. 1) B. Numbers
- Codeforces Round #232 (Div. 2) B. On Corruption and Numbers
- Codeforces Round #136 (Div. 2) B. Little Elephant and Numbers
- Codeforces Round #139 (Div. 2) B. Well-known Numbers
- Codeforces Round #150 (Div. 2) B. Undoubtedly Lucky Numbers
- Codeforces Round #310 (Div. 2) B. Case of Fake Numbers
- Codeforces Round #232 (Div. 2)-B. On Corruption and Numbers
- Round #131 (Div. 1) B. Numbers——dp
- Codeforces Beta Round #77 (Div. 1 Only), problem: (B) Lucky Numbers 数位DP+剪枝DFS+贪心
- Codeforces Round #432 (Div. 1): B. Arpa and a list of numbers
- Codeforces Round #432 (Div. 1) B. Arpa and a list of numbers
- Codeforces Round #131 (Div. 2) A B
- Codeforces Round #119 (Div. 1) B. AlgoRace
- Codeforces Round #215 (Div. 1) <A-B>
- Codeforces Round #225 (Div. 1) B. Volcanoes
- Codeforces Round #230 (Div. 1)B,C
- Codeforces Round #239 (Div. 1)(A,B)
- Codeforces Round #253 (Div. 1)-A,B
- 设计模式C++描述----11.组合(Composite)模式
- Linux Socket编程(不限Linux)
- Nginx 禁止IP访问及未绑定的域名跳转
- 计算机为什么使用补码来存储数据
- xdu 1166 - 括号,又见括号
- Codeforces Round #131 (Div. 1) B. Numbers
- pureMVC相关
- hibernate执行完查询操作后又执行许多更新操作
- struts使用默认action时与通配符的冲突!
- dig理解DNS的解析过程
- Android 4.0 Launcher源码分析系列
- iOS开发——图片转PDF的实现方法
- 一个简单的wifi状态提示广播
- POJ 1018 Communication System (枚举)