洛谷P2602 数字计数 [ZJOI2010] 数位dp
正解:数位dp
解题报告:
打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪心专题里的这题一样
但是仔细一看发现大模拟做得可能太复杂辣,,,讨论有点儿多,但是肯定是讨论得出来的辣想想看省选的时候大力讨论一波就有100pts岂不美哉!
但是反正今天是不会港模拟的解法dei,,,这里港的是数位dp的方法
首先很容易想到的是,数位dp套路来说,它既然是要求[l,r],那就显然是[1,r]-[1,l-1]呐是趴
然后就考虑,设f[i][j]:有i位时第j个数字有几个
首先像个最基础的,不管前导0的影响
显然的是在不管前导0的影响的情况下所有数字的f[i]都是相等的,也就是说能直接删去一维j,变为f[i]:有i位时每个数字有几个.
那转移也很好想鸭,就是f[i]=f[i-1]*10+10i-1.
转移挺好理解的我就随便解释下
首先不管在前面加什么数都有f[i-1]的贡献,前面加的数可以是[0,9]有10种,所以是f[i-1]*10
但还要考虑的是前面加的是j(我知道j这一维已经删了,,但是不好表示,就强行让它出场下QAQ),那就是最高位已经定了,后面还有i-1位可以随便填数,就是10i-1(后面的贡献已经在f[i-1]*10中计入辣)
(话说我jio得这个就是个小学奥数,,,我居然罗里吧嗦解释了这——么多,,,看来确实越来越菜了鸭呜呜呜
(*这里很重要吼,后面的完善其实都是用的这里的思想,刚好一个用了f[i-1]*10的解释一个用了10i-1的解释
然后进一步完善,依然不管前导0,但是考虑到有上限,怎么搞?
那就从高位往低位计算
举个eg趴,ABCD
从高往低想,先是A000,那不考虑最高位,每个数字出现次数就是A*f[3],然后最高位能出现小于等于A的数字,每个数字都能出现103次,然后A000就处理完辣(其实和我之前推的那个转移式的原理是一样的嘛
(嗷对了关于最高位的计算,,,A的那个要特判一下吼!因为显然你只能取到ABCD,就是说你只有BCD次没有1000次!
然后对于B00,C0和D,都是一样的套路鸭,然后就又变成递推式辣484!
最后只要考虑一下前导0怎么除掉呐
认真想一下,前导0的情况显然是前面一串连续的0嘛,然后就一位一位地算呐,其实仔细思考一下,依然是我第一步推的那个式子中的关于10i-1的解释,你想下吼,一样是规定了最高位,一样是后面随便走,那不就是一样的求法嘛,于是假如要求的右边界有n位,这n位都可以是0嘛,于是就是10n-1+10n-2+10n-3+...+100
做完辣!完结撒fafa!
#include<bits/stdc++.h> using namespace std; #define ll long long #define rg register #define rp(i,x,y) for(rg ll i=x;i<=y;++i) #define my(i,x,y) for(rg ll i=x;i>=y;--i) ; ll x,y,f[N]={,},power[N]={,},l[N],r[N],num[N]; inline ll read() { rg ;rg ; '))ch=getchar(); ; )+(x<<)+(ch^'),ch=getchar(); return y?x:-x; } inline void solv(rg ll x[],rg ll y) { rg ll cnt=;,y/=; my(i,cnt,) { rp(j,,)x[j]+=f[i-]*num[i]; rp(j,,num[i]-)x[j]+=power[i-]; rg ll tmp=;my(j,i-,)tmp=tmp*+num[j];x[num[i]]+=tmp+;x[]-=power[i-]; } } int main() {x=read();y=read();rp(i,,)power[i]=power[i-]*,f[i]=f[i-]*+power[i-];solv(l,x-);solv(r,y);rp(i,,)printf(;}
注意要开longlong,,,QAQ
昂对了这题还有记搜/打表找规律/小学数学/二维dp/三维dp等多种方法,,,我暂时不想写辣QAQ就先放下链接指个路QAQ
(最后说一句吼,,,这题和我说的考试里那题挺像的,所以既然这题能用数位dp显然那题也行,还记得sol里出题人港他开始想的解法就是数位dp嘛
所以极大可能我等下会写下那题的数位dp解法!
dbq好像咕辣,,,
洛谷P2602 数字计数 [ZJOI2010] 数位dp的更多相关文章
- 洛谷 - P2602 - 数字计数 - 数位dp
https://www.luogu.org/problemnew/show/P2602 第二道数位dp,因为“数位dp都是模板题”(误),所以是从第一道的基础上面改的. 核心思想就是分类讨论,分不同情 ...
- 【Luogu】P2602数字计数(数位DP)
题目链接 数位DP好喵啊.自己yy两个小时的dfs:题解40行代码=10WA:10A. md而且还不是完全理解题解是什么意思. 所以放题解链接. #include<cstdio> #inc ...
- 洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$
正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解 ...
- BZOJ_1833_[ZJOI2010]count 数字计数_数位DP
BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- 【洛谷】2602: [ZJOI2010]数字计数【数位DP】
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...
- BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp ...
- BZOJ1833 ZJOI2010 count 数字计数 【数位DP】
BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...
- LuoguP2602 [ZJOI2010]数字计数【数位dp】By cellur925
题目传送门 题目大意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 继续数位dp=w=. 这一次我们不需要记录$pre$啦!(撒花). 因为这次我们需要的 ...
随机推荐
- 分析JobInProgress中Map/Reduce任务分配
1.JobTracker能否决定给当前的TaskTracker节点分配一个Job的具体的哪一个任务? 2.什么是map本地任务? 3.nonRunningMapCache的作用是什么? 4.从Task ...
- codeforces水题100道 第二十一题 Codeforces Beta Round #65 (Div. 2) A. Way Too Long Words (strings)
题目链接:http://www.codeforces.com/problemset/problem/71/A题意:将长字符串改成简写格式.C++代码: #include <string> ...
- 《Lua程序设计》第3章 表达式 学习笔记
3.1 算术操作符“+”(加法).“-”(减法).“*”(乘法).“/”(除法).“^”(指数).“%”(取模).3.2 关系运算符< > <= >= == ~=3.3 逻辑操 ...
- phaser相关
phaser.js这个插件,中文翻译的开发文档还在翻译中,至于英文的开发文档,勉勉强强查阅,有些方法名和开发文档的有着一些区别,开发文档上时带着er的.不过大体上还是一一对应查找的到的 eg:load ...
- javascript的fn方法(转)
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展j ...
- 【ORACLE 】查询被锁住的对象,并结束其会话
使用Oracle时,发现有表被锁,又不知道是谁(或者哪个程序)锁的,怎么办 ? 两步走: 1.查找出被锁对象的会话ID和序列号 执行如下SQL: -- 查询出被锁对象,并提供 kill 脚本 SELE ...
- scanf printf gets() puts(),cin cout
最近在练机试题,常用的C和C++输入输出如下: 1 scanf 和printf int a; scanf("%d",&a) ; printf("%d", ...
- 写一个自定义的控件接口 C#
以下是我的测试代码:APP_Code/ucInterface.cs /* APP_Code/ucInterface.cs */ /// <summary> /// Summary desc ...
- zabbix配置server,proxy,agent架构
author: headsen chen date:2018-10-30 19:49:50 环境: centos 6.8_x86_64 zabbix-server: 192.168.1.130 z ...
- Minix中的字符判定ctype.c
minix中关于如何判定一个字符的类型,如大写.小写.数字…… 如果采用传统的方法,如判断一个字母大写的方法: if(c>='A' && c<'Z') return tru ...