P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业
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 烦人的数学作业的更多相关文章
- [洛谷P4999]烦人的数学作业
题目大意:定义$f(x)$表示$x$每一个数位(十进制)的数之和,求$\sum\limits_{i=l}^rf(i)$,多组询问. 题解:数位$DP$,可以求出每个数字的出现个数,再乘上每个数字的大小 ...
- P2602 [ZJOI2010]数字计数(递推)
P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...
- 数位dp详解&&LG P2602 [ZJOI2010]数字计数
数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- luoguP4999 烦人的数学作业
写在前面 这两天信息量有点大,需要好好消化一下,呼呼 \(f[i][j]\) 的转移式还是好理解的,但是对于其实际意义课上有点糊 求 \(ans_{1, x}\) 是感觉手动把数拆开看会好理解一点?? ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- Luogu P2602 [ZJOI2010]数字计数
这算是一道数位DP的入门题了吧虽然对于我来说还是有点烦 经典起手式不讲了吧,\(ans(a,b)\to ans(1,b)-ans(1,a-1)\) 我们首先预处理一个东西,用\(f_i\)表示有\(i ...
- P2602 [ZJOI2010]数字计数
https://www.luogu.org/problemnew/show/P2602 数位dp #include <bits/stdc++.h> using namespace std; ...
- 洛谷 P2602 [ZJOI2010]数字计数
洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...
随机推荐
- ASE19团队项目alpha阶段model组 scrum9 记录
本次会议于11月13日,19时整在微软北京西二号楼sky garden召开,持续7分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing W ...
- SpringBoot+MyBatis+Mysql 6.X 版本日期型数据获,时间错乱,jason序列化时间相差8小时问题
新项目是用的springboot+mybatis+mysql 6.0.6版本的驱动包来搭建的,在使用的过程中遇到以下2个问题 从mysql取的的数据日期时间,与真实的时间往后错乱了14个小时. spr ...
- dict 字典 函数值应用
函数 说明 D代表字典对象 D.clear() 清空字典 D.pop(key) 移除键,同时返回此键所对应的值 D.copy() 返回字典D的副本,只复制一层(浅拷贝) D.update(D2) ...
- 归并排序C程序详解
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; //归 ...
- mysql—数据库优化——如何选择合适的索引
索引的分类: 普通索引: 唯一索引: 主键索引:特殊的唯一索引,唯一且不能有null值: 全文索引:全文索引用来对表中的文本域(char, varchar, text)进行索引 全文索引针对myisa ...
- Web SQL与indexedDB
虽然在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数 ...
- php函数copy和rename的区别
copy ( string source, string dest )将文件从 source 拷贝到 dest.如果成功则返回 TRUE,失败则返回 FALSE. 如果要移动文件的话,请用 renam ...
- okhttp连接池:put,get方法&connection回收
OkHttp连接池put和get方法: 在上一次[https://www.cnblogs.com/webor2006/p/9281429.html]咱们分析了连接拦截器,如下: 不管是Http1.0还 ...
- okhttp任务调度核心类dispatcher解析
在之前已经对okhttp的同步和异步请求的流程进行了详细的分析,其中任务调度是由dispatcher来实现的,非常重要,所以这次专门来对它进行一个了解,带着问题去进行探究: Q1:okhttp如何实现 ...
- 在Myeclipse中没有部署jeesite项目,但是每次运行其他项目时,还是会加载jeesite项目
解决办法: 一.在以下路径中找到jeesite文件,并删除 1.Tomcat 7.0\conf\Catalina\localhost 2.Tomcat 7.0\webapps 3.Tomcat 7.0 ...