P1725数字

问题描述

给出一个整数n和一个数组a。数组a中包含十个整数,编号0到9。
你的任务是统计满足下列条件的正整数的个数:
1.该正整数的长度不能超过n位;
2.该正整数的最高位不能是0;
3.数字i(0<=i<=9)在该正整数中至少出现a[i]次。

输入格式

第一行一个整数n(1<=n<=100)。
第二行,10个空格间隔的整数,表示a[0],a[1]…a[9]里面存的数字

输出格式

一行,一个整数,表示满足条件的数字的个数,结果可能很大,输出与1000000007取模后的结果。

样例输入1:

1
0 0 0 0 0 0 0 0 0 1

样例输入2:

2
1 1 0 0 0 0 0 0 0 0

样例输入3:

3
1 1 0 0 0 0 0 0 0 0

样例输入1:

1

样例输入2:

1

样例输入3:

36


用F[i][j]F[i][j]表示用数字[j,9][j,9]构成长度为ii的数字的方案数。

递推方程:F[i][j]=∑F[i−k][j+1]∗CkiF[i][j]=\sum F[i-k][j+1]*C_{i}^{k}

意味着在ii个位置中放kk个数字jj,这样就保证了满足题目条件,然后剩下的位置上放[j+1,9][j+1,9]的排列方式就是F[i−k][j+1]F[i-k][j+1]

关于00需要特殊讨论,因为00不能放首位,因此有F[i][0]=∑F[i−k][1]∗Cki−1F[i][0]=\sum F[i-k][1]*C_{i-1}^{k}


代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#define N 105
#define ll long long
using namespace std;
ll n,C[N][N],mod=1000000007,a[N],F[N][10],ans;
int main()
{
    ll i,j,k;
    scanf("%lld",&n);
    for(i=0;i<=9;i++)scanf("%lld",&a[i]);    for(i=0;i<=n;i++)C[i][0]=1;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;//预处理组合数    for(i=a[9];i<=n;i++)F[i][9]=1;//赋初值    for(j=8;j>=1;j--)
    for(i=a[j];i<=n;i++)
    for(k=a[j];k<=i;k++)F[i][j]=(F[i][j]+F[i-k][j+1]*C[i][k])%mod;    for(i=a[0];i<=n;i++)
    for(k=a[0];k<=i;k++)
    if(i>0)F[i][0]=(F[i][0]+F[i-k][1]*C[i-1][k])%mod;    for(i=1;i<=n;i++)ans=(ans+F[i][0])%mod;
    cout<<ans;
}

NKOJ 1725 数字(数位dp)相关推荐

  1. Loj #6274. 数字 数位dp + 去重

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数位dpdpdp,设计状态f[pos][flag1][flag2][flag3][flag4]f[pos][flag1][flag2][flag3 ...

  2. 小D的一串数字 (数位DP做法)

    Problem Description 小D在纸上随便写了两串数字,"23333333","0123456789".第一个串中含有7个重复的相邻的数字,第二个串 ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

  5. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  6. bzoj1833: [ZJOI2010]count 数字计数USACO37 Cow Queueing 数数的梦(数位DP)

    难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的--果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全 ...

  7. mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP

    题意:给定一个数n,问从1到n中,0~9这10个数字分别出现了多少次.比如366这个数,3出现了1次,6出现了2次. 题解:<剑指offer>P174:<编程之美>P132 都 ...

  8. 51Nod-1009 数字1的数量【数位DP+记忆化搜索】

    1009 数字1的数量  给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. ...

  9. 牛客小白月赛8: E. 诡异数字(数位DP)

    链接:https://www.nowcoder.com/acm/contest/214/E 来源:牛客网 题目描述 有一天clccle在家里玩手机,突然手机上出现了一个诡异的黑影,眼里闪烁着白光,发出 ...

最新文章

  1. pandas内置数据集_pandas内置数据集_Pandas中的示例数据集
  2. 线程创建后,立刻调用CloseHandle的原因
  3. Leetcode 107. 二叉树的层次遍历 II 解题思路及C++实现
  4. C++ int转string的几种方法比较
  5. coco creator编辑动画坑之拖图片
  6. 开源开放 | 开源大学在线实践数据集及知识图谱MOOPer(CCKS2021)
  7. ggplot2绘图入门系列之四:再说散点图
  8. 【LeetCode笔记】53. 最大子序和(Java、动态规划)
  9. 32 位的有符号整数_leetcode 7 整数反转
  10. python中0、1、True、False、if条件
  11. stm32f1系列单片机实战应用
  12. python knnmatch_opencv python 特征匹配
  13. 数据库基础 MySQL
  14. 深度学习head、neck、backbone三个术语分别是指什么?
  15. 【内核】进程切换 switch_to 与 __switch_to
  16. 20191221每日一句
  17. Windows环境下hadoop安装和配置详细步骤
  18. C语言表白流星(末尾附加下载地址)
  19. 动作捕捉系统FOHEART·MAGIC
  20. kettle日志解析_Kettle运行日志记录

热门文章

  1. 如何正确可视化RAW(ARW,DNG,raw等格式)图像?
  2. ATEC倒计时17天 | 港版支付宝AlipayHK加持的香港“无现金”生活(赠门票)
  3. 计算机excel二级试题及答案,(新)计算机(Excel表格处理)二级考试试题及答案.docx...
  4. c语言某市出租车收费标准如下 3km以内,出租车起步价8元,3km后每千米另加1.2元,小明乘坐出租车行驶x(x3)km,则需要付______元. - 作业在线问答...
  5. 三相桥式全控整流电路simulink仿真_可控硅整流器如何实现整流调压的?
  6. 虚拟机大数据实训项目
  7. 如何做好原始记录,需要特别注意的四个方面
  8. linux怎么导出dmp文件怎么打开,Linux开发实用工具之详解coredump-dmp文件怎么打开...
  9. 沃通免费ssl服务器证书,新版《沃通免费SSL证书申请指南》
  10. Espressif-IDE ESP32 LED Flash 闪烁工程的创建