洛谷 P2602 [ZJOI2010]数字计数
第一次找规律A了一道紫题,写篇博客纪念一下。
这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去。
数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表。
于是我就发现了一些规律。
先献给大家一个打表程序吧~
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long l,r,cnt[10]={};
for (long long t=0;t<=999999;++t) {
l=t*1000000+1;
r=(t+1)*1000000;
for (long long i=l;i<=r;++i) {
long long n=i;
while (n) ++cnt[n%10],n/=10;
}
for (long long i=0;i<=9;++i) cout<<cnt[i]<<' ';
cout<<endl;
}
return 0;
}
这是1~1000000,1000001~2000000,2000001~3000000……的表。
也看一下吧。
488895 600001 600000 600000 600000 600000 600000 600000 600000 600000
1088895 2200000 1200001 1200000 1200000 1200000 1200000 1200000 1200000 1200000
1688895 2800000 2800000 1800001 1800000 1800000 1800000 1800000 1800000 1800000
2288895 3400000 3400000 3400000 2400001 2400000 2400000 2400000 2400000 2400000
2888895 4000000 4000000 4000000 4000000 3000001 3000000 3000000 3000000 3000000
3488895 4600000 4600000 4600000 4600000 4600000 3600001 3600000 3600000 3600000
4088895 5200000 5200000 5200000 5200000 5200000 5200000 4200001 4200000 4200000
4688895 5800000 5800000 5800000 5800000 5800000 5800000 5800000 4800001 4800000
5288895 6400000 6400000 6400000 6400000 6400000 6400000 6400000 6400000 5400001
5888896 7000001 7000000 7000000 7000000 7000000 7000000 7000000 7000000 7000000
7488895 8600002 7600000 7600000 7600000 7600000 7600000 7600000 7600000 7600000
8088895 11200001 8200001 8200000 8200000 8200000 8200000 8200000 8200000 8200000
8688895 12800001 9800000 8800001 8800000 8800000 8800000 8800000 8800000 8800000
这时候你会发现两个规律:
- 每隔一百万,各个数字都会增加600000个,很神奇。
- 对于当前的数字i,如果\(\frac{i}{10^k}>0(5<k<13)\),那么\(cnt[(\frac{i}{10^k})~\texttt{mod}~10]+=1000000\)。
有了这两大规律,我们就可以轻松处理出\(10^{12}\)的大数据了。
复杂度约为\(O(\frac{r-l+1}{1000000})\)
代码在下面:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long a[10]={};
long long l,r;cin>>l>>r;
while (l<r&&l%1000000) {
long long t=l;
while (t) ++a[t%10],t/=10;
++l;
}
while (r>l&&r%1000000) {
long long t=r;
while (t) ++a[t%10],t/=10;
--r;
}
while (l!=r) {
for (int i=0;i<10;++i)
a[i]+=600000;
long long t=1000000;
while (l/t&&t<=1000000000000) {
a[l/t%10]+=1000000;
t*=10;
}
l+=1000000;
}
while (r) ++a[r%10],r/=10;
for (int i=0;i<10;++i) cout<<a[i]<<' ';
return 0;
}
洛谷 P2602 [ZJOI2010]数字计数的更多相关文章
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- [洛谷P2602][ZJOI2010]数字计数
题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...
- 洛谷P2602 [ZJOI2010]数字计数 题解
题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...
- 洛谷P2602 [ZJOI2010] 数字计数 (数位DP)
白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usin ...
- BZOJ1833或洛谷2602 [ZJOI2010]数字计数
BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...
- 【洛谷P2602】数字计数
题目大意:求 [a,b] 中 0-9 分别出现了多少次. 题解:看数据范围应该是一个数位dp. 在 dfs 框架中维护当前的位置和到当前位置一共出现了多少个 \(x,x\in [0,9]\).因此,用 ...
- P2602 [ZJOI2010]数字计数(递推)
P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...
- P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业
P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...
随机推荐
- 【Java面试题】33 HashMap和Hashtable的区别
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和n ...
- 手淘H5移动端适配方案flexible源码分析
移动端适配一直是一个值得探讨的问题,在业余时间我找了一些页面,查看了一些厂商对于移动端H5页面的适配方案,看到了几个典型的例子,今天就来记录一下我看到的第一个典型的例子,也是我们公司目前普通H5项目正 ...
- MathType在手,公式不求人!
很多论文达人们的论文排版是相当漂亮的,页面也非常整齐美观,即使是理工类的论文,里面有很多的数学符号和公式,排版也是非常整洁,为什么达人们的公式论文能排版的这么完美,而自已却总是不得其门而入,最后只好救 ...
- Android中Invalidate与postInvalidate的区别<转>
http://www.cnblogs.com/it-tomorrow/archive/2012/11/08/2760146.html 示例:http://rayleung.iteye.com/blog ...
- AsyncTask应用示例
package com.example.testdemo; import java.io.ByteArrayOutputStream; import java.io.IOException; impo ...
- ArcGIS ArcPy Python处理数据
1.使用搜索游标查看行中的字段值.import arcpy # Set the workspace arcpy.env.workspace = "c:/base/data.gdb" ...
- BigDecimal类(精度计算类)的加减乘除
BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...
- 运行 3ds Max 时出现的性能问题
运行 3ds Max 时性能减慢或迟缓通常是由于视频配置冲突或内存分配问题引起的.关于性能问题的一大难点在于缩小范围确定问题原因.以下是一些限制 3ds Max 操作的常见情形,以及纠正这 ...
- lnmp启动脚本
#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # Ch ...
- COM组件技术名称解释
GUID:全局唯一标识. CLSID 或 ProgID :唯一地表示一个组件服务程序,那么根据这些ID,就可以加载运行组件,并为客户端程序提供服务了. IID :唯一的表示接口ID. COM 组件是运 ...