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. yii框架下使用redis

    1 首先获取到 yii2-redis-master.zip 压缩包 下载地址https://github.com/yiisoft/yii2-redis/archive/master.zip 2 把下载 ...

  2. ListSetAndMap

    package com.collection.test; import java.util.ArrayList; import java.util.HashMap; import java.util. ...

  3. Linux的bg和fg命令

    我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的 ...

  4. 2.03_01_Python网络爬虫urllib2库

    一:urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中抓取出来.在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2 是 Python ...

  5. Sublime text3安装

    一.Sublime text3下载 [20190506]下载 官网下载:https://www.sublimetext.com/ https://download.sublimetext.com/Su ...

  6. TF_Variable Sharing

    Reference: http://jermmy.xyz/2017/08/25/2017-8-25-learn-tensorflow-shared-variables/ Tensorflow does ...

  7. java中的集合总结

    知识点: 集合框架和List.set.Map相关集合特点的描述 Collection接口常用方法,List中相对Collection新增的方法,Collection的遍历(一般for循环,增强for循 ...

  8. 0912 for循环及内置方法

    目录 for 循环 1.循环 2.循环取值 3.range 4.for + break 5.for+continue 6.for + else 数字类型内置方法 整型 浮点型 字符串 1.作用 2.作 ...

  9. python+Appium自动化:MultiAction多点触控

    MultiAction MultiAction 是多点触控的类,常用于模拟用户多点操作. 主要包含这add()还有perform()两个方法,模拟多点触控,需要导入TouchAction还有Multi ...

  10. 定时备份etc目录

    #!/bin/bash # #******************************************************************** #encoding -*-utf ...