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

[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原数的余数直接记下来,然后就很好写了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long l…
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 ?=…
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 设…
这是一篇有些赖皮的题解 (如果不赖皮的话,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\) 位.在这里其实卡了有点久,因为如果除数与被除数都在改变,那么两维的转移是非常凉凉的. 这个时候联想题目的特殊性质 ----- 当感觉无法优化…
传送门 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…
题意简述 求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…
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\),根据同余的性质,可以将求和符号拆开:…
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…
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亿多.于是就要卡常数,具体见代码里面的枚举的…
self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件]1 ≤ a ≤ b ≤ 10^18 约束:一个数是它自己数位和的倍数,直接dp根本找不到状态,枚举数位和,因为总就162,然后问题就变成了一个数%mod=0,mod是枚举的,想想状态:dp[pos][sum][val],当前pos位上数位和是sum,val就是在算这个数%mod,(从高位算  *10…
数位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…
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…
[题意]给出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…
题目描述 给出两个数 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$的合法方案数不就好了吗? 考虑这种状态的转移会发现,从后面做上来不可行啊…
题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$pos$表示当前位置,$sum$表示各位数字之和,$st$表示原数,$limit$表示最高位限制.(如果有时间我会写一篇博客学习数位DP,希望不要咕咕 转移自然是$dfs(pos+1,sum+i,st*10+i)$ 但是一看数据范围,肯定不能这么搜,不然内存会炸.这时我们不妨考虑取模. 根据题目,我们…
一开始没想出来..一看题解 我艹直接枚举数位的和啊.....怪不得给50s. 还是太蠢. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],ret=,dp[][][],vis[][][],tot=; void get_bit(long long x) { ret=; ;x/=;} } long long dfs(lo…
题目: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位预处理,答案好歹是正确的…
给出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…
Link: BZOJ 1799 传送门 Solution: 一句话的题目,看得爽,做得烦 一般这类和数位相关的都是数位$dp$吧 不过一开始还是感觉不太可做,毕竟每个数模数不同 但要发现,模数最高也只可能为$9*19=171$, 于是只要将数按照他们的数位和(即模数)分类计算即可 这样便暴力解决了模数不同的问题 设$dp[sp][sum][rmd][lmt]$表示: 枚举到第$sp$高位,剩下的数的和位$sum$,此时对$mod$余$rmd$时的方案数(lmt表示是否达到上界) 感觉数位$dp$…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 数位DP. 1.循环方法 预处理出每个位数上,和为某个数,模某个数余某个数的所有情况: 因为开四维会爆空间,所以省去模数,为此需要固定模数一次一次累加: 余数的转移,以及可以填数的范围都值得注意. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std;…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1799 [算法] 数位DP [代码] #include<bits/stdc++.h> using namespace std; ; int i; long long a,b,ans; ][MAXS + ][MAXS + ][]; inline long long calc(long long x,int p) { int i,j,k,t,len; ]; len = ; ) { a[…
传送 我们要在dfs的板子里记录哪些量呢?当前填的所有数的和sum?当前填的数构成的数值all? sum可以留下,数值就扔掉叭.数值最大是1e18,要是留下,在g数组里有一维的大小是1e18.也许可以通过特殊方式使chen_zhe把空间上限放到你能存下.手动滑稽 那么为了我们的空间够用,怎么办呢? 上面不记录数值是因为它太大了,那我们能不能让它取模? 当然可以了,不过是对什么取模呢?1e9+7?显然不行,因为l,r<=1e18,产生重复的太多了 大质数?万一你填出来的数是取模数-1那也凉凉. 我…
好累啊啊啊~~~~~~,刷了一天的题了,嗯,再写两篇题解我就去颓Slay... 思路分析: 刚刚我们讲了数位DP,现在就感受一下吧.(其实我也就只敢做做安徽的题,四川的数位DP想都不敢想) 嗯好,我们开始分析题目吧! 这题怎么说呢,额,--很暴力,嗯,非常暴力,暴力到我都不敢去想,(可以说它和大暴力只相差了一个苗条的YLK),然而它是能过的. 怎么个暴力法呢? --直接暴力枚举面积枚举这个数各个数位相加的和,够暴力吧! 开始设计状态(然而我们写的是dfs,其实是一样的),dp[pos][p][s…
时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数位dp 的介绍 数位 dp 其实就是让你处理出某一区间范围内满足条件的数的个数,但是一般这个区间范围都是令人绝望的大...比如 1e9 都算良心了,常规的都是 1e18 甚至是 1e10n (n 一般为 3 或 5)次这样的... 数位dp 的一般解法 那么我们知道肯定不能在区间内一个个去判断数字是…