传送门1
传送门2
写在前面:有关数位DP的题目都会做很久吗……
思路:
(神犇学弟遇到题目的加强版,暴力变DP)
30分直接暴力枚举拆位
100分考虑类似前缀和的做法,我们只要得到[0,a]的各位数码出现次数,同理可得[0,b]的出现次数,作差即可,这里就需要用到数位DP
转移并不困难,f[i][j][k]表示最多是i位数,且最高位为j的所有数中k的出现次数,具体的范围表达可以看图

显然i=1~12,j,k=0~9。而且,f[i][j][k]是可以转移f[i][j+1][k](j<9)和f[i+1][0][k](j=9),注意这里的f[i+1][0][k]表示最高位为0,但实际上就是f[i][9][k]
转移完后我们就可以直接得到0到1..9,19,29..99,199,299..999,1999…….各位数码出现的次数了,但这显然不能满足我们的要求,所以我们可以分块计算,比如12345,我们可以得到0~9999的值,再得到0~1999(实际上是10000~11999,但首位的1恒定,所以我们可以直接计算得到),以此类推到0~299,0~39,0~5。
(感觉还是各种口胡说不清楚,如果有问题还是评论吧)
注意:
1.个位注意单独计算
2.我们并没有办法通过f[i][j][0]直接得到0出现的次数,但它就是总出现次数-1..9出现的次数,所以我们只要算出总出现次数就可以了
3.sum开的int,没有1A不开心

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL a,b;
LL f[14][10][10],p[13];
struct node
{LL sum[10];void prin(){for (int i=0;i<=9;i++){printf("%lld",sum[i]);if (i<9) putchar(' ');}}void clear(){memset(sum,0,sizeof(sum));}
};
node sub(node a,node b)
{node c;for(int i=0;i<=9;i++) c.sum[i]=a.sum[i]-b.sum[i];return c;
}
node solve(LL x)
{node y;y.clear();if (x<=0){y.sum[0]=(x==0);return y;}for (int i=1;i<=9;i++){LL t=x,k=0,wei=log10(x);while (t){if (t/p[wei])y.sum[i]+=f[wei+1][t/p[wei]-1][i]+k*(t/p[wei]*p[wei]);k+=(i==t/p[wei]);t%=p[wei];wei--;}y.sum[i]+=k;}LL tot=0,wei=log10(x);while (wei>=0){tot+=(wei+1)*(x-p[wei]+1+(x<10));x=p[wei]-1;wei--;}for (int i=1;i<=9;i++) tot-=y.sum[i];y.sum[0]=tot;return y;
}
main()
{scanf("%lld%lld",&a,&b);p[0]=1;for(int i=1;i<=12;i++) p[i]=p[i-1]*10; f[1][0][0]=1;for (int i=1;i<=12;i++)for(int j=0;j<=9;j++)for (int k=0;k<=9;k++)if (j<9)f[i][j+1][k]+=f[i][j][k]+f[i-1][9][k]+p[i-1]*(j+1==k);elsef[i+1][0][k]+=f[i][j][k];sub(solve(b),solve(a-1)).prin();
}

【codevs1359】【BZOJ1833】数字计数,进击的学弟与数位DP相关推荐

  1. 2017广东工业大学程序设计竞赛决赛:G. 等凹数字(数位DP)

    Problem G: 等凹数字 Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的, ...

  2. bzoj1833: [ZJOI2010]count 数字计数 codevs1359 数字计数

    bzoj1833 codevs1359 这道题也是道数位dp 因为0有前导0这一说卡了很久 最后发现用所有位数减1~9的位数就okay.....orzczl大爷 其他就跟51nod那道统计1出现次数一 ...

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

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

  4. [BZOJ1833][ZJOI2010]Count数字计数(DP)

    数位DP学傻了,怎么写最后都写不下去了. 这题严格上来说应该不属于数位DP?只是普通DP加上一些统计上的判断吧. 首先复杂度只与数的位数$\omega$有关,所以怎么挥霍都不会超. f[i][j][k ...

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

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

  6. 阿里长达57分钟的电话一面,全程无尿点!乔戈里实验室直系亲学弟的面经分享!...

    乔戈里实验室的学弟阿里面经,一面已过,当时和这位学弟聊起来的时候发现学弟做得是我当年坐的那个实验室位置,哈哈哈,挺有意思.这里和学弟要了一波面经,惊奇地发现学弟连答案都写上了,很用心了!(值得大家学习 ...

  7. 写给学弟们编程入门时必须掌握的HTTP基础知识总结

    经常有刚开始走上编程道路的学弟们,问我一些可能从业人员都懂但是又不好解释的基础知识,最近发现公众号「小白debug」的一篇HTTP基础知识的图解总结的非常好,还有贱萌的小肥柴讲骚话,在这里分享给大家收 ...

  8. 奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)

    大家好,我是冰河~~ 今天给大家带来一篇完整的并发编程学习路线,这应该是全网最全的并发编程学习路线了吧,希望能够为各位小伙伴们带来实质性的帮助. 如果这篇文章对大家有点帮助,小伙伴们点赞,收藏,评论, ...

  9. 二本院校学弟大二开始实习,大三收割阿里、腾讯实习offer

    点击上方 "大数据肌肉猿"关注, 星标一起成长 后台回复[加群],进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 今天介绍的是学校的直系学弟,二本独立院校软工专业,他大 ...

最新文章

  1. DiscuzNT 商品交易插件设计之[线下交易流程]
  2. Centos6部署lamp: httpd2.4+module模式
  3. 这7 款 MySQL 客户端工具,用了都说好!
  4. 51cto 检测ip地址冲突_arping 检测IP地址冲突
  5. python最优调配问题_Python实现的基于优先等级分配糖果问题算法示例
  6. horizontalscrollview+textview简单版
  7. 微信公众号模板消息推送
  8. Ipad mini2、苹果5s降级10.3.3教程
  9. Origin学习中文论坛及自带的learning center
  10. 什么是摄像头自带wifi热点
  11. 硬件设计——外围电路(晶振电路)
  12. 2023年清华交叉信息研究院许华哲组博士招生及研究助理招募 (计算机视觉,强化学习, 机器人学 方向)...
  13. VS调试C++程序,提示无法启动程序,“xx.exe”。系统找不到指定文件的解决办法
  14. Java基础 常见数据结构与算法 项目总结
  15. [4G5G专题-90]:流程 - 4G LTE 终端在RRC IDLE状态下的行为
  16. IDM和迅雷哪个更好用?Internet Download Manager迅雷对比
  17. Excel去重并进行统计(对列)
  18. 接触角测量案例分享及问题解答(一)
  19. 易语言一键选中取消选择列表框源码
  20. 虹科案例 | 虹科Dimetix激光测距传感器可实现无接触式监测采矿设备健康状况!

热门文章

  1. 【Python3网络爬虫开发实战】 1.2.2-Selenium的安装
  2. linux+oracle磁盘空间,Linux下Oracle软件、数据文件等所在的磁盘分区空间不足的解决思路...
  3. 一分钟关闭百度的搜索热点和相关人物
  4. window10安装oracle VirtualBox 虚拟机+ubuntu16.04安装Ros
  5. pycharm在运行TensorFlow时出现如下信息
  6. WORD如何修改自动编号的起始编号值?
  7. js判断字符串是否为空_每日一课 | Python 如何判断一个字符串是否包含另一个字符串?...
  8. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数
  9. C/C++求一个整数的二进制中1的个数
  10. Python练习:期末测评