Description

给出两个数 \(a,~b\) 求出 \([a~,b]\) 中各位数字之和能整除原数的数的个数。

Limitations

\(1 \leq a,~b \leq 10^{18}\)

Solution

考虑数位DP。

设数字 \(A = \sum_{i = 0}^k a_i \times 10^i\),其数字和 \(B = \sum_{i = 0}^k a_i\)

那么 \(A\) 满足条件即为 \(A \equiv 0 \pmod B\),根据同余的性质,可以将求和符号拆开:

\[\sum_{i = 0}^k (a_i \times 10^i \bmod B)~\equiv~0\pmod B
\]

考虑 \(B\) 事实上很小,在 \(18\) 位数字都是 \(9\) 的时候也不超过 \(200\),因此可以枚举 \(B\)。

设 \(f_{i, j, k}\) 位考虑前 \(i\) 位,前 \(i\) 位对应模 \(B\) 的值为 \(j\),且后面几位的数字和为 \(k\),不顶上界的方案数,转移时枚举当前这一位是几即可。

Code

// luogu-judger-enable-o2
#include <cstdio>
#include <cstring> const int maxn = 70;
const int maxm = 163;
const int maxt = 10; int A[maxn], B[maxn];
ll frog[maxn][maxm][maxm]; int ReadNum(int *p);
ll calc(const int *const num, const int n); int main() {
freopen("1.in", "r", stdin);
int x = ReadNum(A), y = ReadNum(B);
ll _sum = 0, _val = 0, _ten = 1;
for (int i = x - 1; ~i; --i) {
_sum += A[i]; _val += A[i] * _ten;
_ten *= 10;
}
qw(calc(B, y) - calc(A, x) + (!(_val % _sum)), '\n', true);
return 0;
} int ReadNum(int *p) {
auto beg = p;
do *p = IPT::GetChar() - '0'; while ((*p < 0) || (*p > 9));
do *(++p) = IPT::GetChar() - '0'; while ((*p <= 9) && (*p >= 0));
return p - beg;
} ll calc(const int *const num, const int n) {
int dn = n - 1;
if (n <= 1) { return num[0]; }
ll _ret = 0, _ten = 1;
for (int i = 1; i < n; ++i) _ten *= 10;
for (int p = 1; p < maxm; ++p) {
memset(frog, 0, sizeof frog);
ll ten = _ten; int tm = ten % p;
int upc = num[0] * tm % p, left = p - num[0];
for (int i = 1; i < num[0]; ++i) if (p >= i) {
frog[0][i * tm % p][p - i] = 1;
}
for (int i = 1; i < n; ++i) {
int di = i - 1;
tm = (ten /= 10) % p;
for (int j = 0; j < p; ++j) {
for (int k = 0; k < p; ++k) {
for (int h = 0; h < 10; ++h) if ((h + k) <= p) {
int dh = h * tm % p, dj = j >= dh ? j - dh : j - dh + p;
frog[i][j][k] += frog[di][dj][k + h];
}
}
}
for (int j = 1; j < 10; ++j) if (j <= p) {
++frog[i][j * tm % p][p - j];
}
for (int h = 0; h < num[i]; ++h) if (h <= left) {
int dh = h * tm % p;
++frog[i][(upc + dh) % p][left - h];
}
upc = (upc + num[i] * tm) % p; left -= num[i];
}
_ret += frog[dn][0][0];
if ((upc == 0) && (left == 0)) ++_ret;
}
return _ret;
}

Summary

逐字符读入 \(L\) 时,\(L - 1\) 并不方便处理,不如改成 \([1, R] - [1,L] + (L\)是否合法\()\)。

【数位DP】【P4127】[AHOI2009]同类分布的更多相关文章

  1. 洛谷 P4127 [AHOI2009]同类分布 解题报告

    P4127 [AHOI2009]同类分布 题目描述 给出两个数\(a,b\),求出\([a,b]\)中各位数字之和能整除原数的数的个数. 说明 对于所有的数据,\(1 ≤ a ≤ b ≤ 10^{18 ...

  2. P4127 [AHOI2009]同类分布

    P4127 [AHOI2009]同类分布 题解 好的,敲上数位DP  DFS板子 记录一下填的各位数字之和 sum ,然后记录一下原数 yuan 最后判断一下  yuan%sum==0 不就好啦??? ...

  3. 洛谷 P4127 [AHOI2009]同类分布

    题意简述 求l~r之间各位数字之和能整除原数的数的个数. 题解思路 数位DP 代码 #include <cstdio> #include <cstring> typedef l ...

  4. 【BZOJ1799】[AHOI2009]同类分布(动态规划)

    [BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原 ...

  5. [BZOJ1799][AHOI2009]同类分布(数位DP)

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 1635  Solved: 728[Submit][S ...

  6. [luogu4127 AHOI2009] 同类分布 (数位dp)

    传送门 Solution 裸数位dp,空间存不下只能枚举数字具体是什么 注意memset最好为-1,不要是0,有很多状态答案为0 Code //By Menteur_Hxy #include < ...

  7. 【[AHOI2009]同类分布】

    这是一篇有些赖皮的题解 (如果不赖皮的话,bzoj上也是能卡过去的) 首先由于我这个非常\(sb\)的方法复杂度高达\(O(171^4)\),所以面对极限的\(1e18\)的数据实在是卡死了 但是这个 ...

  8. [AHOI2009]同类分布

    题目大意: 问在区间[l,r]内的正整数中,有多少数能被其个位数字之和整除. 思路: 数位DP. 极端情况下,每一位都是9,所以各位数字之和不超过9*18.(为了方便这里用了9*19) f[i][j] ...

  9. 【题解】AHOI2009同类分布

    好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ" 实际上这题只要顺藤摸瓜就可以了.首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数:2. ...

随机推荐

  1. ng 使用阿里巴巴矢量图

    1.进入阿里巴巴矢量图标库中,选择需要下载的图标,添加进项目中 2.进去项目选择Font class 模式,然后下载到本地 3.解压下载的压缩包,把.css/.svg/.ttf/.woff/.woff ...

  2. sql server删除重复记录只保留一条

    今天遇到一个历史导入数据重复的问题,于是要删除重复的记录,一开始想用子查询的方式找到要删除记录的id删除,后来发现DELETE语句可以直接用外连接,这样更加简单,效率也更高. delete sys_p ...

  3. history路由模式下的nginx配置

    路由模式 众所周知,浏览器下的单页面应用的路由模式有下面两种: hash 模式和 history 模式.hash 模式通用性好,而且不依赖服务器的配置,省心省力,但是缺点是不够优雅.相比于 hash ...

  4. Python 3 的 int 类型详解(为什么 int 不存在溢出问题?)

    在以前的Python2中,整型分为int和long,也就是整型和长整型, 长整型不存在溢出问题, 即可以存放任意大小的数值,理论支持无限大数字. 因此在Python3 中,统一使用长整型,用int表示 ...

  5. [转]Java游戏引擎

    JME(jMonkey Engine): JME是一个高性能的3D图形API,采用LWJGL作为底层支持.它的后续版本将支持JOGL.JME和Java 3D具有类似的场景结构,开发者必须以树状方式组织 ...

  6. JavaScript中的类方法、对象方法、原型方法

    类方法:也叫函数方法,在JavaScript中函数也是一个对象,所以可以为函数添加属性以及方法: 对象方法:包括构造函数中的方法以及其原型上面的方法: 原型方法:一般用于对象实例共享,在原型上面添加该 ...

  7. Python3的map/reduce

    Python内建了map()和reduce()函数. 原文在这里MapReduce: Simplified Data Processing on Large Clusters,map/reduce的概 ...

  8. JIRA的安装及配置

    JIRA安装    命令行打开服务:cmd:services.msc 同禅道和tapd是一样功能的. 1.安装jdk 2.安装mysql 3.安装JIRA  JIRA安装密钥的查找 1.登陆管理页面: ...

  9. 面试官:讲讲redis的过期策略如何实现?

    时隔多日,小菜鸡终于接到阿里的面试通知,屁颠屁颠的从上海赶到了杭州. 经过半个小时的厮杀: 自我介绍 hashMap和ConcurrentHashMap区别 jdk中锁的实现原理 volatile的使 ...

  10. EFK日志搭建

    安装java 安装java1.8以上的版本并验证 [root@localhost ~]# yum install java [root@localhost ~]# java -version open ...