正解:数位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的更多相关文章

  1. 洛谷 - P2602 - 数字计数 - 数位dp

    https://www.luogu.org/problemnew/show/P2602 第二道数位dp,因为“数位dp都是模板题”(误),所以是从第一道的基础上面改的. 核心思想就是分类讨论,分不同情 ...

  2. 【Luogu】P2602数字计数(数位DP)

    题目链接 数位DP好喵啊.自己yy两个小时的dfs:题解40行代码=10WA:10A. md而且还不是完全理解题解是什么意思. 所以放题解链接. #include<cstdio> #inc ...

  3. 洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解 ...

  4. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  5. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

  6. 【洛谷】2602: [ZJOI2010]数字计数【数位DP】

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...

  7. BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp ...

  8. BZOJ1833 ZJOI2010 count 数字计数 【数位DP】

    BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...

  9. LuoguP2602 [ZJOI2010]数字计数【数位dp】By cellur925

    题目传送门 题目大意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 继续数位dp=w=. 这一次我们不需要记录$pre$啦!(撒花). 因为这次我们需要的 ...

随机推荐

  1. Maven编译出现“[ERROR] java.lang.OutOfMemoryError: Java heap space”

    Windows下添加环境变量MAVEN_OPTS的value为-Xms1024m -Xmx1024m -Xss1m Linux下可修改.profile或者.bash_profile文件,并做如下设置: ...

  2. C语言中一个字符数组里面的所有元素变成一个字符串

    #include <string.h> int main() // 这里为了方便直接用main函数 {     char array[] = { 'h', 'e', 'l', 'l', ' ...

  3. 手写自己的ThreadLocal(线程局部变量)

    ThreadLocal对象通常用于防止对可变的单实例变量或全局变量进行共享. 精简版: public class MyThreadLocal<T> { private Map<Thr ...

  4. Mac 下如何下载、启动和关闭Tomcat 和管理Mac自带的Apache

     Mac 下载.启动和关闭Tomcat 1. 下载Tomcat(地址:tomcat.apache.org),选择适合的版本(这里选择6.0.48),点击“Download”,之后在新页面点击“Core ...

  5. PHP curl get post通用类

    <?php /** * @author:xiaojiang * curl 通用方法 ..get /post 传送数据 */ class process{ const GET = 0; const ...

  6. Bypassing PatchGuard on Windows x64

    [说明] 1.  本文是意译,加之本人英文水平有限.windows底层技术属菜鸟级别,本文与原文存在一定误差,请多包涵. 2.  由于内容较多,从word拷贝过来排版就乱了.故你也可以下载附件. 3. ...

  7. DELPHI XE Android 开发笔记

    第一次编译时,设定android SDK: F:\RAD Studio XE6\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk F:\RAD Stud ...

  8. elasticsearch基础----->elasticsearch环境的搭建

    这里面我们主要是在ubuntu系统上对elasticsearch进行一个环境的搭建,记录一下这个过程中遇到的一些问题以及解决方案.我总是躲在梦与季节的深处,听花与黑夜唱尽梦魇,唱尽繁华,唱断所有记忆的 ...

  9. Python读写txt文本文件

    一.文件的打开和创建 ? 1 2 3 4 5 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python!\n ...

  10. sencha touch list + carousel scrollable(与其他控件共用滚动条)

    有些时候我们需要实现这种效果 上边是一张图片或者一个跑马灯控件,这个布局实现起来比较容易 但是如何让他们共用一个滚动条,来实现以下效果就比较麻烦了. 在官方论坛查找资料得知,可以用以下写法实现: /* ...