题目链接:

http://codeforces.com/problemset/problem/213/B

B. Numbers

time limit per test 2 seconds
memory limit per test 256 megabytes
#### 问题描述
> Furik loves writing all sorts of problems, especially such that he can't solve himself. You've got one of his problems, the one Furik gave to Rubik. And Rubik asks you to solve it.
>
> There is integer n and array a, consisting of ten integers, indexed by numbers from 0 to 9. Your task is to count the number of positive integers with the following properties:
>
> the number's length does not exceed n;
> the number doesn't have leading zeroes;
> digit i (0 ≤ i ≤ 9) occurs in the number at least a[i] times.
#### 输入
> The first line contains integer n (1 ≤ n ≤ 100). The next line contains 10 integers a[0], a[1], ..., a[9] (0 ≤ a[i] ≤ 100) — elements of array a. The numbers are separated by spaces.
#### 输出
> On a single line print the remainder of dividing the answer to the problem by 1000000007 (109 + 7).
#### 样例
> **sample input**
> 3
> 1 1 0 0 0 0 0 0 0 0
>
> **sample output**
> 36

note

numbers 10, 110, 210, 120, 103 meet the requirements. There are other suitable numbers, 36 in total.

题意

给你0到9这十个数字,第i个数至少要用a[i]次,问能拼成的长度小于等于n的正整数(不能有前导零)

题解

dp[i][len]表示利用i到9的数字能拼成的长度为len的所有可能数。

状态转移方程:dp[i][len]=sigma(dp[i+1][len-k]*C[len][k])。

相当于是在用i+1到9凑成的长度为len-k的数字串里面塞进去k个i的所有可能数。用乘法原理可知去掉已经统计出来的len-k,我们要处理的就是从len里面选k个位置来放i。

注意:由于前导零不用考虑,而且只要统计正整数,所以我们在放0的时候,是不能让零放在第一位的,对于0我们可以特殊处理一下。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; typedef __int64 LL; const int maxn = 111;
const int mod = 1e9 + 7; int dig[22],n;
LL dp[22][maxn]; LL C[maxn][maxn];
void pre() {
memset(C, 0, sizeof(C));
C[0][0] = 1;
for (int i = 1; i < maxn; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) {
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
C[i][j] %= mod;
}
}
} int main() {
pre();
scanf("%d", &n);
for (int i = 0; i < 10; i++) {
scanf("%d", &dig[i]);
}
memset(dp, 0, sizeof(dp));
dp[10][0] = 1;
for (int i = 9; i > 0; i--) {
for (int j = 0; j < maxn; j++) {
for (int k = dig[i]; k <=j; k++) {
dp[i][j] += dp[i + 1][j - k] * C[j][k];
dp[i][j] %= mod;
}
}
}
for (int j = 0; j < maxn; j++) {
for (int k = dig[0]; k < j; k++) {
dp[0][j] += dp[1][j - k] * C[j - 1][k];
dp[0][j] %= mod;
}
}
LL ans = 0;
for (int j = 1; j <= n; j++) {
ans += dp[0][j];
ans %= mod;
}
printf("%I64d\n", ans);
return 0;
}

Codeforces Round #131 (Div. 1) B. Numbers dp的更多相关文章

  1. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  2. Codeforces Round #131 (Div. 2) E. Relay Race dp

    题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...

  3. Codeforces Round #260 (Div. 1) A - Boredom DP

    A. Boredom Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/problem/A ...

  4. Codeforces Round #131 (Div. 2)

    A. System of Equations \(a\)的范围在\(\sqrt n\)内,所以暴力枚举即可. B. Hometask 需要被2.5整除,所以末位必然为0,如果0没有出现,则直接返回-1 ...

  5. Codeforces Round #276 (Div. 1) D. Kindergarten dp

    D. Kindergarten Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/proble ...

  6. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  7. Codeforces Round #539 (Div. 2) 异或 + dp

    https://codeforces.com/contest/1113/problem/C 题意 一个n个数字的数组a[],求有多少对l,r满足\(sum[l,mid]=sum[mid+1,r]\), ...

  8. Codeforces Round #374 (Div. 2) C. Journey DP

    C. Journey 题目连接: http://codeforces.com/contest/721/problem/C Description Recently Irina arrived to o ...

  9. Codeforces Round #202 (Div. 1) D. Turtles DP

    D. Turtles Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/547/problem/B ...

随机推荐

  1. Js图片滚动

    参考博文:http://blog.chinaunix.net/uid-12304670-id-2947067.html <%@ Page Title="" Language= ...

  2. C#利用Attribute实现简易AOP介绍 (转载)

    地址:http://dotnet.9sssd.com/csbase/art/638 http://wayfarer.blog.51cto.com/1300239/279913 http://devel ...

  3. 解决Access连接 accdb 不可识别的数据库格式异常

    在Access07之前的数据库后缀名均为*.mdb 而连接字符串写成Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myFolder\*.mdb ;Pe ...

  4. JavaScript 一些基础练习

    JavaScript为网页添加动态效果并实现与用户交互的功能.改变颜色以及宽高,隐藏或显示内容,取消设置 <style type="text/css"> body { ...

  5. 前端javascript发送ajax请求、后台书写function小案例

    HTML端页面: <td> <input class="pp_text" type="text" name="" valu ...

  6. Lua 的函数库 01

    这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. table函数库 一部分的table函数只对其数组部分产生影响, 而另一部分则对整个 ...

  7. MYSQL查询某字段中以逗号分隔的字符串的方法

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  8. Eclipse插件推荐:UCDetector: Unnecessary Code Detector

    正如其名,检查不必要的代码. 下载地址为:http://sourceforge.net/projects/ucdetector/files/latest/download?source=files 官 ...

  9. java android 访问DELPHI 的DATASNAP

    最新版的DELPHI开发DATASNAP非常简单便捷,DataSnap的REST风格和对JSON的支持,使之成为服务器端开发的神器. 一.DATASNAP服务器中的方法: TServerMethods ...

  10. C#高级功能(二)LINQ 和Enumerable类

    介绍LINQ之前先介绍一下枚举器 Iterator:枚举器如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.我们将以创建一个简单化的 ...