写在前面

这两天信息量有点大,需要好好消化一下,呼呼

\(f[i][j]\) 的转移式还是好理解的,但是对于其实际意义课上有点糊

求 \(ans_{1, x}\) 是感觉手动把数拆开看会好理解一点??

同级某巨佬wxf会用记忆化搜索做,我不会,太菜了


luoguP4999 烦人的数学作业

简述题意:

给定区间 \([ L , R ]\) ,求 \(L\) 到 \(R\) 区间内每个数字和 $ (1 \le L \le R \le 10^{18}) $ ,共 \(T\) 组数据 \((1 \le T \le 20)\)

Solution:

数位DP入门题?

设 \(f[i][j]\) ,第一维表示枚举到第 \(i\) 位, 第二维表示以 \(j\) 为最高位, \(f\) 数组用来存数字和

如 \(f[i][j]\) 中存的是 \([j000\cdots \ , \ j999\cdots]\) 这一区间的数字和,(其中每个数都有 \(i\) 位)

初始状态: \(f[1][i] = i \ (0 \le i \le 9)\)

考虑怎么转移,新枚举到的 \(f[i][j]\) 是在 \(f[i -1][k]\) 基础上加上新的一位,而因为新的一位后面可以跟 \(0 - 9\) 所有数,所以 \(k\) 的取值是 \(0 - 9\) , 因为这样的数的数量是 \(10^{i - 1}\) 个,所以转移方程就推出来啦:

\[f[i][j] = ( \sum_{k = 0}^{9} f[i - 1][k] ) + j \times 10^{i - 1}
\]

考虑最后怎么合并答案 \(ans_{l, r}\) ,

可以考虑先求出 \(ans_{1, l}\) 和 \(ans_{1, r + 1}\) 的答案,最后在进行合并(至于为什么是 \(l\) 和 \(r + 1\) 后面会进行解释

手模一个样例看看: \(ans_{1, 114514}\)

发现可以将它拆开:

\[\begin{aligned}
& 114514 = \{ 0 - 99999 \} + \{ 100000 - 109999\} \\
& + \{ 110000 - 110999 ,111000 - 111999 , 112000 - 112999 , 113000 - 113999 \} \\
&+ \cdots \\
\end{aligned}
\]

用 \(f[i][j]\) 数组一个一个代换即可,前面多出的数可以用 \(sum\) 存一下在循环最后处理

在每一层后面处理一下前面多出的数(感觉说不清楚,感性理解一下/kk

可以发现循环到最后一位时并不会加上最后一个数,所以将所求区间整理一下就好啦

LL solve(LL x){
LL ans = 0, sum = 0;
LL s[22], len = 0;
for(;x; x /= 10) s[++len] = x % 10; for(int i = len; i >= 1; --i){
for(int j = 0; j < s[i]; ++j){
ans = (ans + f[i][j]) % mod;
}
ans = (ans + sum * s[i] * quick_pow(10, i - 1) % mod) % mod;
sum = (sum + s[i]) % mod;
}
return ans;
}

(一开始感觉这样写比 \(Aliemo\)写的简单,后来发现并没有什么本质的区别)

code:

/*
Work by: Suzt_ilymics
Knowledge: 数位DP
Time: luogu最优解第五?
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long using namespace std;
const int mod = 1e9+7; LL read(){
LL s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0', ch = getchar();
return s * w;
} LL T, l, r, ans = 0;
LL f[22][22]; LL quick_pow(LL x, LL p){//快速幂
LL res = 1;
for( ; p; p >>= 1){
if(p & 1) res = res * x;
x = x * x;
}
return res;
} void init(){//初始化
for(int i = 1; i <= 9; ++i) f[1][i] = i; for(int i = 2; i <= 19; ++i){
for(int j = 0; j <= 9; ++j){
for(int k = 0; k <= 9; ++k){
f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
}
f[i][j] = (f[i][j] + j * quick_pow(10, i - 1)) % mod;
// cout<<f[i][j]<<" ";
}
// cout<<"\n";
}
} LL solve(LL x){//求ans(1 - x)
LL ans = 0, sum = 0;
LL s[22], len = 0;
for(;x; x /= 10) s[++len] = x % 10; for(int i = len; i >= 1; --i){
for(int j = 0; j < s[i]; ++j){
ans = (ans + f[i][j]) % mod;
}
ans = (ans + sum * s[i] * quick_pow(10, i - 1) % mod) % mod;
sum = (sum + s[i]) % mod;
}
return ans;
} signed main()
{
init();
T = read();
while(T--){
l = read(), r = read();
printf("%lld\n", (solve(r + 1) - solve(l) + mod) % mod);
}
return 0;
}
/*
in:
2 1 1000000000000000000 1 1000000000000000000 out:
3970 3970 */

luoguP4999 烦人的数学作业的更多相关文章

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

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

  2. [洛谷P4999]烦人的数学作业

    题目大意:定义$f(x)$表示$x$每一个数位(十进制)的数之和,求$\sum\limits_{i=l}^rf(i)$,多组询问. 题解:数位$DP$,可以求出每个数字的出现个数,再乘上每个数字的大小 ...

  3. 题解 P4999 【烦人的数学作业】

    数位 dp. 设 \(dp_{q,i}\)(\(i\in\{0,1,2,3,4,5,6,7,8,9\}\))为 \(1\sim q\) 中 \(i\) 出现的次数,\(1\sim q\) 的数字和显然 ...

  4. 得物(毒)APP,8位抽奖码需求,这不就是产品给我留的数学作业!

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  5. BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘

    2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...

  6. sdibt 1244 烦人的幻灯片

    在这个OJ站还没号,暂时没提交,只是过了样例 真不愧是烦人的幻灯片,烦了我一小时 ---更新:OJ测试完毕,AC 烦人的幻灯片问题 Time Limit: 1 Sec  Memory Limit: 6 ...

  7. bzoj2326: [HNOI2011]数学作业

    矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...

  8. BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )

    BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...

  9. iOS 界面 之 EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具

    http://blog.csdn.net/fatherhui iOS开发,EALayout 无需反复编译,可视化实时界面,告别Storyboard AutoLayout Xib等等烦人的工具 EALa ...

随机推荐

  1. HTTP 常用状态码200 301 302 403 500

    200(OK):成功处理了请求. 301 redirect: 301 代表永久性转移(Permanently Moved) //助记 1 永恒,如果你记住了这一条就算这篇博客没白写.302 redir ...

  2. 第一章节 BJROBOT ROS 网络配置及移动控制【ROS全开源阿克曼转向智能网联无人驾驶车】

    版权声明:该教程版权归北京智能佳科技有限公司所有,未经公司授权禁止引用.发布.转载等,否则将追究其法律责任. 使用前说明:本使用文档说明略微简明,请结合指导视频进行操作会更容易理解!! 第一章节 BJ ...

  3. 解决Github下载仓库慢的正确姿势

    上个月刚安装了 Manjaro ,然后最近在Manjaro下载Github的项目竟然只有几十b/s,这能忍?对于下载Github上的代码是硬需求,没办法直接探索一下突破的方法了. 方法一:安装chro ...

  4. linux下网络设置和远程连接

    配置ip.子网掩码.静态设置.开机启动ONBOOT网卡 /etc/sysconfig/network-scripts/ifcfg-eth0 重启网络 service  network  restart ...

  5. CSS_rules

    CSS 特性 1)控制灵活,功能强大 元素-->标签 针对html的元素 2)可以设置html元素的属性,与html框架的进行分离 3)执行效率更高 CSS语法 text-indent 文字缩进 ...

  6. WPF + RDLC + 动态生成列 + 表头合并

    如下,评论超过20条,马上发代码*(੭*ˊᵕˋ)੭*ଘ,效果如下: 代码逻辑简单. WPF使用RDLC需要使用如下DLL 新建WPF 窗体,黏贴下大概如下 <Window xmlns:rv=&q ...

  7. (解决)easypoi图片导出只占用一个单元格

    @ 目录 前提 依赖环境 问题原因 解决方案 重写jar中的方法 原理 前提 本解决方案来源于网络,因解决自己需求,因此自行记录起来,如有侵权请联系我. 依赖环境 easypoi--依赖版本3.1.0 ...

  8. 2021超详细的HashMap原理分析,面试官就喜欢问这个!

    一.散列表结构 散列表结构就是数组+链表的结构 二.什么是哈希? Hash也称散列.哈希,对应的英文单词Hash,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出 这个映射的规则就是对 ...

  9. 【JavaWeb】i18n 国际化

    i18n 国际化 什么是 i18n 国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问. 希望相同的一个网站,不同人访问的时候 ...

  10. linux中常用服务的安装

    安装环境:centos7.5 配置离线yum源参考:https://blog.csdn.net/mayh554024289/article/details/54236336vi /etc/yum.co ...