洛谷

第一次找规律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. QQ空间留言的JS

    直接上代码吧... var i=0; var time; function test(str) { i++; document.getElementById('tgb').contentWindow. ...

  2. 搞笑的<Button></Button>

    <button>竟然默认是submit按钮</button>.........................

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

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

  4. sql 一些题目

    这道SQL笔试题你会怎么写(转) 最近面试了一些Senior BI的候选人,行业经验三年到七年不等,起初觉得这个Level的无需准备笔试题,碍于领导执念,就在真实项目中提取5道SQL题目,这里仅单说其 ...

  5. 总结ASP.NET C#中经常用到的13个JS脚本代码

    1.按钮前后台事件 <asp:Button ID="Button1" runat="server" OnClick="Button1_Click ...

  6. Unity利用UI的Mask实现对精灵Sprite的遮挡

    例如剔除掉船超出河流的一部分,实现让船只在河流之上显示. 其实是利用UI层的Mask实现遮罩,有些不同的是Mask的图片是用Camera渲染到RenderTexture动态产生的纹理实现的.大概步骤如 ...

  7. 基于nodejs的开源博客

    https://github.com/hexojs/hexo https://hexo.io/zh-cn/docs/ markdown编辑器 http://pandao.github.io/edito ...

  8. C# 温故而知新:Stream篇(二)

    TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简 ...

  9. DM8168 PWM驱动与測试程序

    昨天把DM8168的Timer设置给摸了一遍,为写PWM的底层驱动做好了准备,如今就要进入主题了. dm8168_pwm.c: #include <linux/module.h> #inc ...

  10. java编写的2048程序

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util ...