题目链接: P4999 烦人的数学作业

题目大意

详见题目

solution

有一个显而易见的结论

发现 \(ans_{l, r} = ans_{1. r} - ans_{1, l - 1}\)

那只需要处理 \(1 - r\) 的即可

设 \(f_{i, j}\) 表示长度为 \(i\) 最高位为 \(j\) 的和

\(f_{i, j} = \sum\limits_{k = 0}^{k \leqslant 9} f_{i - 1, k} + j * 10^{i - 1}\)

对于\(ans_{1, r}\) 我们可以采用以下策略 :

设 \(len\) 为 \(r\) 的位数, \(a_{len}\) 为 \(r\) 的每一位

  1. 对于所有长度小于 \(len\) 的 \(f\) , \(res += f_{i, j}, i \in [1, len - 1], j \in [1, 9]\)
  2. 对于长度等于 \(len\)且最高位小于 \(a_{len}\) 的 \(f\) , \(res += f_{len, j}, j \in [1, a_{len})\)
  3. 然后对于剩下的 \(len - 1\) 位, 我们继续执行 \(2\) 操作同时对之前已经操作过去的位数加和然后在往后操作时加上对应的次数的乘积, 不过 \(j\in [0, a_i)\) (因为最高位已经不为0了)

不过我们在处理时, 处理不到 \(r\)(其实是因为我不会)

那么答案就是 \(ans_{1, r + 1} - ans_{1, l}\)

那么状态转移就出来了,然后对结果进行分治即可

Code:

/**
* Author: Aliemo
* Data:
* Problem:
* Time: O()
*/
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm> #define int long long
#define rr register #define inf 1e9
#define MAXN 100010 using namespace std; const int mod = 1e9 + 7; inline int read() {
int s = 0, f = 0;
char ch = getchar();
while (!isdigit(ch)) f |= ch == '-', ch = getchar();
while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
return f ? -s : s;
} void print(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) print(x / 10);
putchar(x % 10 + 48);
} int L, R, T, len, ans; int f[20][20], a[20]; inline int f_pow(int x, int y) {
int ans = 1;
while (y) {
if (y & 1) ans = (ans * x) % mod;
x = (x * x) % mod;
y >>= 1;
}
return ans % mod;
} inline void init() {
memset(f, 0, sizeof f);
for (rr int i = 0; i <= 9; i++) f[1][i] = i;
for (rr int i = 2; i <= 18; i++) {
for (rr int j = 0; j <= 9; j++) {
for (rr int k = 0; k <= 9; k++)
f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
f[i][j] = (f[i][j] + j * f_pow(10, i - 1)) % mod;
// cout << f[i][j] << " ";
}
// cout << "\n";
}
} inline int solve(int x) {
memset(a, 0, sizeof a);
len = ans = 0;
int sum = 0;
while(x) {
a[++len] = x % 10;
x /= 10;
}
for (rr int i = 1; i < len; i++)
for (rr int j = 1; j <= 9; j++)
ans = (ans + f[i][j]) % mod;
for (rr int i = 1; i < a[len]; i++) ans = (ans + f[len][i]) % mod;
// cout << ans << "\n";
sum += a[len];
for (rr int i = len - 1; i >= 1; i--) {
for (rr int j = 0; j < a[i]; j++)
ans = (ans + f[i][j]) % mod;
ans = (ans + sum * a[i] * f_pow(10, i - 1) % mod) % mod;
sum += a[i];
}
return ans % mod;
} signed main() {
T = read();
init();
while (T--) {
L = read(), R = read();
cout << (solve(R + 1) - solve(L) + mod) % mod<< "\n";
}
}

洛谷 P4999的更多相关文章

  1. 洛谷 P4999(数位DP)

    ###洛谷 P4999 题目链接 ### 题目大意:给你一个区间,求这段区间中所有数的,数位上的,数字之和. 分析: 这题与 洛谷 P2602 相似,稍微改一下就可以了. 求出 0 ~ 9 的个数,然 ...

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

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

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  7. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  8. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  9. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. IDEA git 切换分支

    如图:打开DIEA , 在右下角找到Git分支 , 然后选择你要切换的分支 , 最后选择 Checkout

  2. 循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

    在很多列表展示数据的场合中,大多数都会需要一个排序的处理,以方便快速查找排序所需的数据,本篇随笔介绍如何结合ABP后端和Vue+Element前端结合的分页排序处理过程. 1.Vue+Element前 ...

  3. 2020DevOps状态报告

    这是Puppet报告的走过的第九个年头,本次报告基于对2400名IT.开发.信息安全行业的技术人员的调研,着重勾画了DevOps状态的两大趋势:平台模型.需求变更的管理.多年来,我们已经证明了DevO ...

  4. File对象目录列表器

    /****File对象即能代表一个文件又能代表一组目录下的特定文件集:如果它代表一组文件那可以用list方法返回一组字符数组,数组内的对象是该目录下的符合条件的每个文件. 为什么说符合条件下这个前提呢 ...

  5. JAVA_基础IO流对象流(三)

    处理流:对象流 ObjectInputStream和OjbectOutputSteam用于存储和读取基本数据类型数据或对象的处理流.可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来. ...

  6. Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架

    前言     Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发.     如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...

  7. PO,BO,VO,DTO,POJO,DAO,DO是什么?

    PO (Persistent Object)   持久化对象,表示实体数据.BO (Business Object)        业务对象,主要是把逻辑业务封装为一个对象 .VO (Value/Vi ...

  8. sqlserver 清除表数据和拷贝表结构的操作

    最近在做一个ERP系统需要导入数据,因此用到了sql的一些操作,在这里记录一下. 1.清除表数据: Delete from 表名称 where XXX 2.拷贝表结构,需求是新增一个和某个表数据格式一 ...

  9. CopyOnWriteArrayList设计思路与源码分析

    CopyOnWriteArrayList实现了List接口,RandomAccess,Cloneable,Serializable接口. CopyOnWriteArrayList特性 1.线程安全,在 ...

  10. python学习笔记 | 列表去重

    ''' @author: 人人都爱小雀斑 @time: 2020/3/10 10:29 @desc: ''' L=[1,5,7,4,6,3,0,5,8,4,4] 方法1:for循环 L1=[] for ...