洛谷

第一次找规律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]数字计数的更多相关文章

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

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

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

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

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

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

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

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

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

    白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usin ...

  6. BZOJ1833或洛谷2602 [ZJOI2010]数字计数

    BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...

  7. 【洛谷P2602】数字计数

    题目大意:求 [a,b] 中 0-9 分别出现了多少次. 题解:看数据范围应该是一个数位dp. 在 dfs 框架中维护当前的位置和到当前位置一共出现了多少个 \(x,x\in [0,9]\).因此,用 ...

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

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

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

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

随机推荐

  1. Spring定时器Quartz的用法

    首先导入需要的两个jar: spring-context-support-4.1.1.RELEASE.jar quartz-2.2.1.jar 1.创建两个类: 2. QuartzConfigurat ...

  2. poj 3414 Pots(广搜BFS+路径输出)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:id=3414">http://poj.org/probl ...

  3. Oracle行列转换的思考与总结

    最近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久.现在问题得到了解决虽说不算完美.但是还是和大家一起分享一下. 行列转换之一:sum(case wh ...

  4. MathType中输入破折号的教程

    MathType公式编辑器中的包含的各种数学符号与模板已经足够我们在编辑公式时使用了,但是除此之外,MathType还有一些符号并不是数学专有的符号,但是在数学中也偶尔会用到,比如破折号.MathTy ...

  5. [转] Windows局域网通过NTP设置时间同步

    NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议. 如果局域网计算机(Windows系统)可以连接Internet,可以通过“控制面板”— ...

  6. Ocx控件注册不成功?可能是tlb文件导致~

    Ocx文件是最常用的文件,实际操作中常常需要注册之~ 但是问题来了,经常会出现注册不成功的问题: 解决方法: 1.以“管理员身份”注册 2.Dependency Walker查看依赖是否缺失 3.查看 ...

  7. swift - 之 UICollectionView的用法/自定义流布局

    具体代码如下: 1.声明 var hCollectionView:UICollectionView? var layout:UICollectionViewFlowLayout? let course ...

  8. array_diff 不注意的坑

    1)array_diff 是对比两个(或以上数组)的值的差集,注意是对比数组的值,和数组的键无关 2)是以第一个数组为对比对象,找上在第一个数组里有但其他数组里没有的值(可以同值但不同键的多个) 举个 ...

  9. 【RF库Collections测试】Get From Dictionary

    Name:Get From DictionarySource:Collections <test library>Arguments:[ dictionary | key ]Returns ...

  10. 第七篇:Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...