CodeForces 213B Numbers

$dp$,组合数。

$dp[i][j]$表示只用数字$i$,$i+1$,$i+2$......,$9$,凑成长度为$j$的并且数字$i$到$9$符合要求的方案数。只要枚举数字$i$用几个就可以转移了。

$dp[i][j] = \sum\limits_{k = a[i]}^n {(dp[i + 1][j - k]} *c[j][k])$,$0$的时候需要特别写一下转移方程,因为$0$不能放在第一位。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int n,a[15],sum[15];
long long c[110][110],dp[15][110];
long long mod=1e9+7;

int main()
{
    for(int i=0;i<=100;i++) c[i][0]=c[i][i]=1;
    for(int i=1;i<=100;i++)
    {
        for(int j=1;j<i;j++)
        {
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
        }
    }

    scanf("%d",&n);
    for(int i=0;i<=9;i++) scanf("%d",&a[i]);

    memset(dp,0,sizeof dp);

    for(int i=a[9];i<=n;i++) dp[9][i]=1;

    for(int i=8;i>=0;i--)
    {
        sum[i]=sum[i+1]+a[i];
        for(int j=sum[i];j<=n;j++)
        {
            for(int k=a[i];k<=j;k++)
            {
                if(i!=0) dp[i][j]=(dp[i][j]+dp[i+1][j-k]*c[j][k]%mod)%mod;
                else
                {
                    if(j-1>=0) dp[i][j]=(dp[i][j]+dp[i+1][j-k]*c[j-1][k]%mod)%mod;
                }
            }
        }
    }

/*
    for(int i=9;i>=0;i--)
    {
        cout<<"---- "<<i<<"----";
        for(int j=0;j<=n;j++)
        {
            cout<<dp[i][j]<<"*";
        }
        cout<<endl;
    }
*/
    long long ans=0;
    for(int i=1;i<=n;i++) ans=(ans+dp[0][i])%mod;

    printf("%lld\n",ans);

    return 0;
}
时间: 2024-10-10 16:50:09

CodeForces 213B Numbers的相关文章

codeforces Beautiful Numbers

来源:http://codeforces.com/problemset/problem/1265/B B. Beautiful Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a permutation p=[p1,p2,…,pn]p=[p1,p2,…,pn] of integers

CodeForces 13A Numbers

题目链接:http://codeforces.com/problemset/problem/13/A 题意:给出一个A,范围是3-1000,求2-(A-1) 进制下 A的各位数字上的和的平均数,以(分子/分母)的最简的形式输出. 分析: 例如 5. 二进制 101 为2 三进制 12 为3 四进制 11 为2 平均值为7/3: 代码: #include<cstdio> #include<cmath> #include<cstring> #include<queue

CodeForces 128D Numbers(贪心?)

题意: 就是给你n个正整数数(3 <= n <= 10^5), 每个正整数数都不超过10^9, 现在问是否能将这n个数排成一个环, 使得换上相邻两个数的差都是1 表示也不知道解法的正确性如何 ,  YY了一下 题解: 就是拿出n 个数里面最大的,  然后往小了选, 如果接下来需要的小1的没有了,就跳到比这个数大1 的 ,  跑到末尾之后,  看看最后一个是否和第一个相差1 ,  感觉这么做能过... 代码: #include<stdio.h> #include<string.

数位dp整理

1.CodeForces 55DBeautiful numbers 题目大意:一个数是幸运数当且仅当这个数能整除所有位数,求[a,b]有多少幸运数 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int maxa = 20; const int mod = 2520; long long dp[maxa][1<<8][mod]; #defin

Codeforces 9C Hexadecimal&#39;s Numbers - 有技巧的枚举

2017-08-01 21:35:53 writer:pprp 集训第一天:作为第一道题来讲,说了两种算法, 第一种是跟二进制数联系起来进行分析: 第二种是用深度搜索来做,虽然接触过深度搜索但是这种题型还是我第一次见: 题目: 统计1~n之间有多少数字只由0,1构成 1 ≤ n ≤ 1e9 用深度搜索解决这种问题: 代码如下: #include <iostream> #include <map> using namespace std; map<int,int>vis;

[2016-04-14][codeforces][630][C][ Lucky Numbers]

时间:2016-04-14 23:12:27 星期四 题目编号:[2016-04-14][codeforces][630][C][ Lucky Numbers] 题目大意: 问n位数字以内的幸运数字有多少个 幸运数字:只含有7,8的数字 分析: 长度为i 的幸运数字,每一位有两种可能,7 , 8,那么长度为i的幸运数字总共有 $2^i$中可能 那么长度为n 以内的所有幸运数字 就是 $2^1 + 2^2 + - + 2^n$, #include<cstdio> using namespace

codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)

In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 = 1; F2 = 1; Fn = Fn - 1 + Fn - 2 (n > 2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of n integers: a1, a2, ...,

Codeforces 449D:Jzzhu and Numbers

Codeforces 449D:Jzzhu and Numbers 题目链接:http://codeforces.com/problemset/status?friends=on 题目大意:给出$n$个数,求有多少种组合使得$a_{i_1}\&a_{i_2}\&...\&a_{i_k}=0(0 \leqslant i < n)$,答案对$10^9+7$取模. 容斥原理+DP 设位与$(\&)$后二进制表示中有$k$个$1$的组合数为$A_k$,则有, $A_0=$所有

codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-14) Description In mathematical terms, the sequence Fn of Fibonacci numbers is defi