题目链接:

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. Linux下CPU占用率高分析方法

    一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29 ...

  2. 设置ShowDialog

    1.在winform窗体中的button控件,可以直接设置DialogResult属性为OK或者Cancel来控制其他窗口中调用此窗口需要验证DialogResult结果是OK还是其他....

  3. Ubuntu10.10的网络配置

    有一阵子着实对Ubuntu的网络配置很迷惑,耐下心来仔细上网找了找,有点小心得,总结一下. 先说下大概的配置过程,再去细究一些情况. 一.配置大概分三类:通过配置文件配置.通过命令配置.通过图形化的网 ...

  4. 支付宝收款连接 非API

    <a href="https://shenghuo.alipay.com/send/payment/fill.htm?_form_token=mMYOrAXfReOtBBCMmoaK7 ...

  5. PHP请求页面

    < ?php $file_contents = file_get_contents('http://www.ccvita.com/'); echo $file_contents; ?> 有 ...

  6. Flask Web Development —— Web表单(上)

    Flask-WTF扩展使得处理web表单能获得更愉快的体验.该扩展是一个封装了与框架无关的WTForms包的Flask集成. Flask-WTF和它的依赖集可以通过pip来安装: (venv) $ p ...

  7. Learning Scrapy笔记(五)- Scrapy登录网站

    摘要:介绍了使用Scrapy登录简单网站的流程,不涉及验证码破解 简单登录 很多时候,你都会发现你需要爬取数据的网站都有一个登录机制,大多数情况下,都要求你输入正确的用户名和密码.现在就模拟这种情况, ...

  8. 02-线性结构2 Reversing Linked List

    由于最近学的是线性结构,且因数组需开辟的空间太大.因此这里用的是纯链表实现的这个链表翻转. Given a constant K and a singly linked list L, you are ...

  9. 最大子列和CT 01-复杂度2 Maximum Subsequence Sum

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  10. Python核心编程--学习笔记--9--文件和输入输出

    本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...