题目大意:定义$f(x)$表示$x$每一个数位(十进制)的数之和,求$\sum\limits_{i=l}^rf(i)$,多组询问。

题解:数位$DP$,可以求出每个数字的出现个数,再乘上每个数字的大小即可。

卡点:无(结构体记得写构造函数清空)

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 20
const int mod = 1e9 + 7;
inline void reduce(int &x) { x += x >> 31 & mod; }
inline int getreduce(int x) { return x + (x >> 31 & mod); } int Tim;
struct node {
int s[10], cnt;
inline node() { __builtin_memset(s, 0, 10 << 2); cnt = 0; }
inline void operator += (const node &rhs) {
for (int i = 0; i < 10; ++i) reduce(s[i] += rhs.s[i] - mod);
reduce(cnt += rhs.cnt - mod);
}
inline int get() {
int res = 0;
for (int i = 1; i < 10; ++i) reduce(res += static_cast<long long> (s[i]) * i % mod - mod);
return res;
}
} F[maxn], I;
bool vis[maxn]; int num[maxn], tot;
node calc(int x, bool lim, bool lead) {
if (!x) return I;
if (!lim && lead && vis[x]) return F[x];
node f;
for (int i = lim ? num[x] : 9, op = 1; ~i; --i, op = 0) {
node val = calc(x - 1, lim && op, lead || i);
f += val;
if (i || lead) reduce(f.s[i] += val.cnt - mod);
}
if (!lim && lead) F[x] = f, vis[x] = true;
return f;
}
int solve(long long x) {
if (x < 0) return 0;
tot = 0;
while (x) {
num[++tot] = x % 10;
x /= 10;
}
return calc(tot, true, false).get();
} int main() {
scanf("%d", &Tim);
I.cnt = 1;
while (Tim --> 0) {
long long l, r;
scanf("%lld%lld", &l, &r);
printf("%d\n", getreduce(solve(r) - solve(l - 1)));
}
return 0;
}

  

[洛谷P4999]烦人的数学作业的更多相关文章

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

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

  2. luoguP4999 烦人的数学作业

    写在前面 这两天信息量有点大,需要好好消化一下,呼呼 \(f[i][j]\) 的转移式还是好理解的,但是对于其实际意义课上有点糊 求 \(ans_{1, x}\) 是感觉手动把数拆开看会好理解一点?? ...

  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. 洛谷 P4999

    题目链接: P4999 烦人的数学作业 题目大意 详见题目 solution 有一个显而易见的结论 发现 \(ans_{l, r} = ans_{1. r} - ans_{1, l - 1}\) 那只 ...

  5. 洛谷 P4999(数位DP)

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

  6. 洛谷 P1858 多人背包 DP

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 洛谷 P1858 多人背包 题目描述 求01背包前k优解的价值 ...

  7. [洛谷P1858] 多人背包

    洛谷题目链接:多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数K.V.N 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 输入输出样例 输入样例# ...

  8. 洛谷——P2083 找人

    P2083 找人 题目背景 无 题目描述 小明要到他的同学家玩,可他只知道他住在某一单元,却不知住在哪个房间.那个单元有N层(1,2……N),每层有M(1,2……M)个房间. 小明会从第一层的某个房间 ...

  9. 洛谷 P1858 多人背包 解题报告

    P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说 ...

随机推荐

  1. spring源码-bean之加载-2

    一.前面说了bean的容器初始化,后面当然是说bean的加载.这里还是不讲解ApplicationContext的bean的加载过程,还是通过最基础的XmlBeanFactory来进行讲解,主要是熟悉 ...

  2. c的多态

    使用函数数组,实现多态 参考my_strtoll10

  3. centos下php环境安装redis

    一.安装redis(仅可在服务器使用,尚不能通过浏览器访问) (1)首先下载redis:wget http://download.redis.io/releases/redis-4.0.9.tar.g ...

  4. Linux命令应用大词典-第26章 模块和内核管理

    26.1 lsmod:显示内核中模块的状态 26.2 get_module:查看内核模块详细信息 26.3 modinfo:显示内核模块信息

  5. 韦大仙python--购物车

    程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...

  6. [CodeForce721C]Journey

    题目描述 Recently Irina arrived to one of the most famous cities of Berland - the Berlatov city. There a ...

  7. 解决ssh_exchange_identification:read connection reset by peer 原因

    服务器改了密码,试过密码多次后出现: ssh_exchange_identification: read: Connection reset by peer 可以通过ssh -v查看连接时详情 Ope ...

  8. [SHELL]linux环境变量

  9. 数据库Mysql的学习(八)-储存过程和事务和导入导出

    储存过程 DELIMITER // CREATE PROCEDURE pro1() BEGIN SELECT book_id,book_name,category FROM bookinfo t1 J ...

  10. 如何借助windows的VHD引导特性实现VHD多windows系统共存

    近期,由于一些需要,需要运行3个windows系统,具体需要如何此处略去,现将实现方式共享如下. 测试环境: HP 820 G2, 4G内存, 500G SSD硬盘 windows 7 企业版 win ...