题目描述 给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数. 输入输出格式 输入格式: 一行,两个整数 aa 和 bb 输出格式: 一个整数,表示答案 输入输出样例 输入样例#1: 复制 10 19 输出样例#1: 复制 3 说明 对于所有的数据, 1 ≤ a ≤ b ≤ 10^{18}1≤a≤b≤1018 题解 数位dp 至于怎么判是否整除 我们可以考虑枚举所有位之和是多少 然后记录一下当前数模所有位之和的余数 如果为$0$说明可行 //minamot…
求出[a,b]中各位数字之和能整除原数的数的个数. 有困难的一道题.被迫看了题解:枚举每一个各位数字的和($<=162$),设计状态$f[len][sum][rest]$表示dp后面$len$位,要求这剩下的和是$sum$,并且其对$sum$取模是$rest$的方案数. 感觉也讲不出什么道理来,真的是..经验问题啊...当时数位dp不太会,现在看来稍微好些了.或者也可以从最高位往后看,设前面填好的高位组成的各位和是sum,mod枚举剩rest,到最低位再检验正确性. 转移(向下一层dp)时就是把…
各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条件]1 ≤ a ≤ b ≤ 10^18 题目分析 好像10^18左右的数位dp都是乱搞就好了 既然是要求整除原数,那么数位之和肯定要放进状态里,并且枚举数位总和地去dp. 看上去好像$f[i][j]$表示后面$i$位总和为$j$的合法方案数不就好了吗? 考虑这种状态的转移会发现,从后面做上来不可行啊…
数位dp 先从1到162枚举各位数之和 s[i][j][k][l]表示i位数,第一位小于等于j,当前各位数字和为k,当前取模余数为l的方案数 然后脑补一下转移就行了 详见代码 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #define ll long l…
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Input   Output   Sample Input 10 19 Sample Output 3 HINT [约束条件]1 ≤ a ≤ b ≤ 10^18 Source Day1 类似hdu 4389 #pragma com…
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 2357  Solved: 1079[Submit][Status][Discuss] Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条件]1 ≤ a ≤ b ≤ 10^18 Source Day1 [Submit][Stat…
Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ; ], mod; ll sum[][][]; ll dfs(int pos, int ad, int r, b…
题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$pos$表示当前位置,$sum$表示各位数字之和,$st$表示原数,$limit$表示最高位限制.(如果有时间我会写一篇博客学习数位DP,希望不要咕咕 转移自然是$dfs(pos+1,sum+i,st*10+i)$ 但是一看数据范围,肯定不能这么搜,不然内存会炸.这时我们不妨考虑取模. 根据题目,我们…
[题意]给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1 ≤ a ≤ b ≤ 10^18 [算法]数位DP [题解] 感觉这种方法很暴力啊. 枚举数位和1~162(不能枚举0,不然会模0,相当于除0),记忆化f[pos][sum][val],sum表示当前数位和,val表示数字取模枚举的数位和. 每次sum+i和(val*10+i)%MOD转移. sum用减法优化,即记忆化(MOD-sum),但是枚举过程中都要memset,导致效率低下,记忆化效果很差. 要什么方法才能跑1.3s…
我这种蒟蒻就一直不会写数位dp.. 于是开了个坑.. 1833: [ZJOI2010]count 数字计数 这道被KPM大爷说是入门题..嗯似乎找找规律然后减掉0的情况后乱搞就可以了..(但是还是写了很久TAT #include<cstring> #include<iostream> #include<cstdio> #include<queue> #include<cmath> #include<algorithm> #define…
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MBSubmit: 1635  Solved: 728[Submit][Status][Discuss] Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Input Output Sample Input 10 19 Sample Output 3 HINT [约束条件]1 ≤ a ≤ b ≤ 10^18 Source Day1 设…
3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2267  Solved: 1040[Submit][Status][Discuss] Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了.花神的题目是这样的设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数…
BZOJ  1026: [SCOI2009]windy数: 题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1026           dp[11][11][2]:dep,pre,f 要求的性质就是相邻数字差至少是2.          递归函数的状态设计如下dep,pre,f,分别表示已经枚举到第dep位,他的前一位(更高的位)是pre,f表示大小关系是否已经确定. #include<bits/stdc++.h> using na…
题目: 3209: 花神的数论题 解析: 二进制的数位DP 因为\([1,n]\)中每一个数对应的二进制数是唯一的,我们枚举\(1\)的个数\(k\),计算有多少个数的二进制中有\(k\)个\(1\) 设\(n\)的二进制一共有\(num\)位,有\(sum[i]\)个数的二进制中有\(k\)个\(1\), 答案就是\(\prod_{i=1}^{num}i^{sum[i]}\) 用数位DP搞一下就好了 设\(f[i][j]\)表示到第\(i\)位有\(j\)个\(1\)时有多少个数 枚举\(k\…
前言:鸣谢https://www.luogu.com.cn/blog/virus2017/shuweidp.感谢大佬orz ----------------------------- [引入] 首先要明白数位DP解决的是什么问题. 问题:求出在$[L,R]$内满足条件$f(i)$的$i$的个数.$f(i)$一般不与数的大小有关,而是与数的组成有关.(数的大小对复杂度的影响很小) [设计搜索] 数位DP一般都用记忆化搜索来实现. 一.记搜过程 从起点向下搜索,到最底层得到方案数,一层一层向上返回答…
目录 写在前面 引入 求解 特判优化 代码 例题 「ZJOI2010」数字计数 「AHOI2009」同类分布 套路题们 「SDOI2014」数数 写在最后 写在前面 19 年前听 zlq 讲课的时候学的东西,当时只会抄板子,现在来重学一波= = 一个板子水一天题(不事 引入 「SCOI2009」Windy 数 给定参数 \(l,r\),求 \([l,r]\) 中不含前导零且相邻两个数字之差至少为 \(2\) 的正整数的个数. \(1\le l\le r\le 2\times 10^9\). 1S…
BZOJ1799self 同类分布 去博客园看该题解 题意 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. [约束条件]1 ≤ a ≤ b ≤ 10^18 题解 1.所有的位数之和<9*18=1622.所以,dp[i][j][k][m]表示有i位(允许有前导0),数位和为k,模数为m,前i位与模数的模为j的符合条件的数的个数.这样要炸空间,怎么办!!其实这个dp的最后一维可以省去,因为对于不同的m值,dp互不相干.这样还是要超时的,有5亿多.于是就要卡常数,具体见代码里面的枚举的…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 数位DP. 1.循环方法 预处理出每个位数上,和为某个数,模某个数余某个数的所有情况: 因为开四维会爆空间,所以省去模数,为此需要固定模数一次一次累加: 余数的转移,以及可以填数的范围都值得注意. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std;…
传送门 Solution 裸数位dp,空间存不下只能枚举数字具体是什么 注意memset最好为-1,不要是0,有很多状态答案为0 Code //By Menteur_Hxy #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define Re registe…
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\),根据同余的性质,可以将求和符号拆开:…
[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原数的余数直接记下来,然后就很好写了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long l…
给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1<=a<=b<=1e18. 注意到各位数字之和最大是153.考虑枚举这个东西.那么需要统计的是[0,a-1]和[0,b]内各位数字之和为x且能整除x的数字个数. 那么我们只需要数位dp一波即可. 令dp[pos][i][x]表示有pos位且数字之和为x的数mod P=i的数字个数. 则转移方程显然可得. # include <cstdio> # include <cstring> # include…
P4127 [AHOI2009]同类分布 题目描述 给出两个数\(a,b\),求出\([a,b]\)中各位数字之和能整除原数的数的个数. 说明 对于所有的数据,\(1 ≤ a ≤ b ≤ 10^{18}\) 数位dp 枚举被mod的数,\(dp_{i,j,k}\)表示前\(i\)位和为\(j\)模后为\(k\)的数的个数 记忆化时随便转移一下就行了 Code: #include <cstdio> #include <cstring> #define ll long long ll…
P4127 [AHOI2009]同类分布 题解 好的,敲上数位DP  DFS板子 记录一下填的各位数字之和 sum ,然后记录一下原数 yuan 最后判断一下  yuan%sum==0 不就好啦??? 突然意识到 dp 数组咋存??? dp[pos][sum][yuan] pos , sum 都可以记录,但是 yuan ??? 1e18??? 我们可以把yuan取模啊! yuan%mod  ? 取模啥呢???如果固定一个取模数字,结果很有可能就不对了,那就枚举吧 看到原式 yuan%sum ?=…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 https://www.luogu.org/problemnew/show/P4127 经典dp! 一个数能被它的各位和整除,在L-R内有多少个. 1.数位dp的套路,先预处理出第i位.后面任意的所有情况. 因为涉及整除,所以状态有“模当前数余几”: 因为涉及各位和,所以状态有“i位和为j”和“模k”: 好了我们有了一份会MLE的四维代码,而且有会超时的18位预处理,答案好歹是正确的…
这是一篇有些赖皮的题解 (如果不赖皮的话,bzoj上也是能卡过去的) 首先由于我这个非常\(sb\)的方法复杂度高达\(O(171^4)\),所以面对极限的\(1e18\)的数据实在是卡死了 但是这个时候可以骗一下 一般来说肯定会有一个点的数据到达了\(1e18\),所以我们先将\(1\)到\(1e18\)之间的答案算出来,这样再去算另一个左边界的话至少可以节省一半的常数,就算左边界不是很小也有可能还算点希望 如果左边界特别小的话,可能就能幸运的卡过去 这道题的左边界就非常小啊,我估计不超过\(…
题目大意: 问在区间[l,r]内的正整数中,有多少数能被其个位数字之和整除. 思路: 数位DP. 极端情况下,每一位都是9,所以各位数字之和不超过9*18.(为了方便这里用了9*19) f[i][j][k][flag],表示DP到从左往右第i位时,各位数字之和为j,这个数字在模mod意义下为k. flag表示是否为边界情况. 转移的时候枚举这一位上的数p. 设当前位是cur,则转移方程为: f[i-1][j+p][(k*10+p)%mod][false]+=f[i][j][k][false];…
好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ" 实际上这题只要顺藤摸瓜就可以了.首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数:2.0/1状态表示是否受限制(这一条是因为有数字上限).然后根据这两个维度来接着往下想.第二个维度先撇开不看,我们只考虑如何从第 \(i - 1\) 位dp到第 \(i\) 位.在这里其实卡了有点久,因为如果除数与被除数都在改变,那么两维的转移是非常凉凉的. 这个时候联想题目的特殊性质 ----- 当感觉无法优化…
题意简述 求l~r之间各位数字之和能整除原数的数的个数. 题解思路 数位DP 代码 #include <cstdio> #include <cstring> typedef long long ll; int cnt, C; int num[20]; ll l, r; ll dp[20][200][200]; ll dfs(int len, int sum, int rem, int mod, bool limit, ll s = 0) { if (!len) return sum…
预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blog/virus2017/shuweidp 数位dp嘛,顾名思义...就是与每个数上的那位有关系...(废话) 一般问题形式都是,在区间$[l,r]$中,满足xx条件的数有多少.然后数据范围一般巨大,枚举是不可能的,这辈子是不可能的.所以一般我们都把它当做字符串处理,预处理出每一位的数(数位),即之后…