【题解】[P2602ZJOI2010]数字计数

乍看此题,感觉直接从数字的位上面动手,感觉应该很容易。

但是仔细看数据范围,发现如果不利用计数原理,肯定会超时,考虑数码出现的特征:

\(A000\)到\(A999\),四位数中的\(A\)总共出现了\(999-0+1\)次。假设\(A\)在第\(k\)位上,那么它出现了\(10^{k-1}\)次。记录一下这个的前缀和。特别注意的是, 由\(dp(i)\rightarrow dp(i+1)\)时,要\(dp(i+1)=10dp(i)+10^{i-1}\),这是考虑到在第\(i+1\)位上增加一位会给\(i\)位带来\([0,9]\)总共10的贡献。那么\(A\)出现的次数就被我们确定了。

显然对于\(A233\)这样的数字,我们不能直接调用前面我们预处理的数组,因为它的值域是在\([233,995]\)的,而非\([000,999]\)。其实这样也好办,\(A\)出现的次数直接就是\(233-000+1=233+1\)。最后对于\(A\)特殊处理即可。

然后我们从处理四位数到了处理三位数了。就是一个一样的子问题。

#include<bits/stdc++.h>

using namespace std;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
typedef long long ll;
#define endl '\n'
#define spc ' '
#define int ll
TMP inline ccf qr(ccf b){
char c=getchar();
int q=1;
ccf x=0;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxn=15;
ll F,T;
int cntf,cntt;
int ans[maxn];
int ans2[maxn];
int num[maxn];
ll dp[maxn]={0,1};
ll ten[maxn]={1}; inline void dfs(int* d,ll data){
register int cnt=0;
while(data)
num[++cnt]=data%10,data/=10; DRP(t,cnt,1){
RP(i,0,9)
d[i]+=dp[t-1]*num[t];
RP(i,0,num[t]-1)
d[i]+=ten[t-1];
register ll temp=0;
DRP(i,t-1,1)
temp=temp*10LL+num[i];
d[num[t]]+=temp+1;d[0]-=ten[t-1];
}
} signed main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif ten[1]=10;
RP(t,2,14)
ten[t]=ten[t-1]*10ll,dp[t]=dp[t-1]*10ll+ten[t-1]; F=qr(1ll);
T=qr(1ll); dfs(ans,T);
dfs(ans2,F-1LL); RP(t,0,9)
cout<<ans[t]-ans2[t]<<spc;
cout<<endl;
return 0;
}

【题解】P2602[JZOI2010]数字计数的更多相关文章

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

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

  2. P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业

    P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...

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

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

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

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

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

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

  6. 洛谷P2602 [ZJOI2010]数字计数 题解

    题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...

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

    题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...

  8. Luogu P2602 [ZJOI2010]数字计数 数位DP

    很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...

  9. P2602 [ZJOI2010]数字计数

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

随机推荐

  1. 平衡树之非旋Treap

    平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强 ...

  2. spring-cloud - 服务之间的通信

    上文中已经讲述了基本环境搭建,本文基于上文环境https://www.cnblogs.com/xxpandong/p/10485172.html. spring-cloud中微服务之间通信主要有俩种形 ...

  3. 2016北京集训测试赛(十六)Problem A: 任务安排

    Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...

  4. 【转】又一次线上 OOM 排查经过

    又一次线上OOM排查经过 最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时.问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dum ...

  5. SecureCRT字体大小随屏幕调节设置

  6. 设置ListView的item不能点击

    写了一个ListView结合volley的demo ListView只是用来展示数据,所以不需要点击效果. 网上搜索了下: 可以禁用ListView ListView.setEnabled(false ...

  7. iOS for循环创建button,button的宽度依据上面的文字来自适应.

    近期须要使用一个标签页,寻思自己写一个demo. 标签的大小依据上面的文字来自适应大小,须要依据后台返回的数据自己主动换行.没有加入 NSArray *arr = @[@"无知", ...

  8. python 制作wordcloud词云

    pip install wordcloud 需要用到numpy  pillow matplotlib 安装完成以后 wordcloud_cli --text in.txt --imagefile ou ...

  9. android listView 滑动载入数据 该数据是服务端获取的

    package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import ja ...

  10. js 模拟发短信

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...