洛谷

第一次找规律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. c语言的fopen

    c语言fopen函数 fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, “文件指针名”必须是被说明为FILE 类型的指针变量: “文件名” ...

  2. 简单日历插件jquery.date_input.pack

    html: <link rel="stylesheet" type="text/css" href="css/jquery.date_input ...

  3. mysql5.7 编码统一utf-8

    查看mysql数据库编码: show variables like 'character%'; mysql> show variables like 'character%'; +------- ...

  4. JUC回顾之-线程池的原理和使用

    Java并发编程:线程池的使用   Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程 ...

  5. Asp.Net实现FORM认证的一些使用技巧(必看篇)

    最近因为项目代码重构需要重新整理用户登录和权限控制的部分,现有的代码大体是参照了.NET的FORM认证,并结合了PORTAL KITS的登录控制,代码比较啰嗦,可维护性比较差.于是有了以下的几个需求( ...

  6. unity如何停止不用字符串方式开启协程的方法

    通常我们知道开启协程用StartCoroutine("Method"); 停止协程用StopCoroutine("Method"); 如果我们想要终止所有的协程 ...

  7. linux环境中,nginx安装过程

    需求描述: 记录在linux平台,nginx安装的过程. 环境描述: 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 操作内核版 ...

  8. DiscuzX的目录权限设置1

    经常有朋友遇到Discuz目录权限设置出错的问题,网上千奇百怪的教程非常多,所谓的终极安全的教程更是满天飞,各种所谓的安全加强软件也随处可见,可实际过程中发现,老手用不上,新手则只会因为这些东西徒增麻 ...

  9. C++的virtual详解

    类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的,其实不然,Visual BA ...

  10. 我觉得epoll和select最大的区别

    最近在用epoll,网速资料很多,大家都说epoll和select的区别比较大,而且select要不停遍历所有的fd,效率要低,而且fd有限制. 但是我认为二者最大的区别在于 先看代码 while ( ...