bzoj1799同类分布——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799
数位DP。
1、循环方法
预处理出每个位数上,和为某个数,模某个数余某个数的所有情况;
因为开四维会爆空间,所以省去模数,为此需要固定模数一次一次累加;
余数的转移,以及可以填数的范围都值得注意。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll l,r,mul[],f[][][],ans,sx;
int a[][],w[];
void cl(int t,ll tmp)
{
while(tmp)
{
a[t][++w[t]]=tmp%;
tmp/=;
}
}
void pw()
{
mul[]=;
for(int i=;i<w[];i++)//<
mul[i]=mul[i-]*;
}
void pre(int s)
{
memset(f,,sizeof f);
f[][][]=;
ll lm=;
for(int i=;i<w[];i++)//<
{
lm=min(s,i*);
for(int j=;j<=lm;j++)
for(int l=;l<s;l++)
for(int p=;p<=&&j-p>=;p++)
// f[i][j][l]+=f[i-1][j-p][((s-(l-p*mul[i-1]))%s+s)%s];
f[i][j][l]+=f[i-][j-p][((l-p*mul[i-])%s+s)%s];
}
}
ll cal(int t,int s)
{
ll cnt=,lj=;
int ss=;
for(int i=w[t];i;i--)
{
int lm=a[t][i];
if(i==)lm++;
for(int p=;p<lm&&s-ss-p>=;p++)
cnt+=f[i-][s-ss-p][(s-(lj+p*mul[i-])%s)%s];//
ss+=a[t][i];lj+=a[t][i]*mul[i-];
}
return cnt;
}
int main()
{
scanf("%lld%lld",&l,&r);
cl(,l-);cl(,r);
pw();
sx=(w[]-)*+a[][w[]];
for(int s=;s<=sx;s++)
{
pre(s);
ans+=cal(,s)-cal(,s);
}
printf("%lld",ans);
return ;
}
2、递归方法
记忆化,代码极简单,详见注释。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int a[],mod,cnt,tot;
ll f[][][][],vis[][][][],x,y;//tot时间戳
ll dp(int p,int d,int s,int v)//p为有无限制,d为第几位,s为位数和,v为模余数
{
if(!d)return (!s&&!v);//边界
if(vis[p][d][s][v]==tot)return f[p][d][s][v];//记忆化
vis[p][d][s][v]=tot;
ll l=max(,s-(d-)*),r=min(s,((p)?a[d]:));//
ll cnt=;
for(int i=l;i<=r;i++)
cnt+=dp((p&(i==a[d])),d-,s-i,(*v+i)%mod);//%mod而非%s
return f[p][d][s][v]=cnt;
}
ll solve(ll x)
{
for(cnt=;x;x/=)a[++cnt]=x%;
ll tmp=;
for(mod=;mod<=cnt*;mod++)//cnt*9而非a[cnt]*9
tot++,tmp+=dp(,cnt,mod,);//一开始就有限制
return tmp;
}
int main()
{
scanf("%lld%lld",&x,&y);
printf("%lld",solve(y)-solve(x-));
return ;
}
bzoj1799同类分布——数位DP的更多相关文章
- [BZOJ1799][AHOI2009]同类分布(数位DP)
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MBSubmit: 1635 Solved: 728[Submit][S ...
- BZOJ1799 self 同类分布 数位dp
BZOJ1799self 同类分布 去博客园看该题解 题意 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. [约束条件]1 ≤ a ≤ b ≤ 10^18 题解 1.所有的位数之和&l ...
- BZOJ1799 [Ahoi2009]self 同类分布[数位DP]
求出[a,b]中各位数字之和能整除原数的数的个数. 有困难的一道题.被迫看了题解:枚举每一个各位数字的和($<=162$),设计状态$f[len][sum][rest]$表示dp后面$len$位 ...
- bzoj 1799: [Ahoi2009]self 同类分布 数位dp
1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...
- BZOJ 1799 同类分布(数位DP)
给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1<=a<=b<=1e18. 注意到各位数字之和最大是153.考虑枚举这个东西.那么需要统计的是[0,a-1]和[0,b ...
- [luogu4127 AHOI2009] 同类分布 (数位dp)
传送门 Solution 裸数位dp,空间存不下只能枚举数字具体是什么 注意memset最好为-1,不要是0,有很多状态答案为0 Code //By Menteur_Hxy #include < ...
- 数位dp 笔记
目录 数位dp 笔记 解决的问题 & 主体思想 入门 -- windy数 绕一个弯 -- 萌数 the end? -- 恨7不成妻 小心细节 [SDOI2016]储能表 复杂度起飞 [AHOI ...
- [BZOJ1799][Ahoi2009]self 同类分布(数位dp)
题目描述 给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数. 输入输出格式 输入格式: 一行,两个整数 aa 和 bb 输出格式: 一个整数,表示答案 输入输 ...
- 【数位dp】bzoj1799: [Ahoi2009]self 同类分布
各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...
随机推荐
- 转: Android开发的网络抓包
方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包记录到本地,再把抓到的.cap文件导到pc上面用wireshark来分析.这里步骤非常多,在和后台联调的时候,这个效率是非常低 ...
- less 项目实战
1.注释 less 的注释有两种方法,"/**/" 和 "//",前一种会在 css 文件中显示,后一种不会在 css 显示. 2.定义变量的方法:" ...
- NYOJ 722 数独 【DFS】+【预处理】
数独 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家须要依据9×9盘面上的已知数字,推理出全部剩余空格的数字,并满足每一 ...
- 《UNIX-Shell编程24学时教程》读书笔记Chap1,2 Shell基础,脚本基础
Chap1 Shell基础 知道该使用哪种命令是依赖于经验的.----惟手熟尔. 1.1 什么是命令 其实知道这些名词好像也没什么帮助,嘻嘻 1.2 什么是Shell 不同用户不同的提示符:不同的环境 ...
- JavaScript的string方法(demo)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 显卡接口PCI、VGA、PCIE
转:1.PCIe扫盲系列博文连载 2.http://blog.sina.com.cn/s/blog_a73f94190102w2j2.html 1.AGP(Accelerated Graphics P ...
- 内核顶层Makefile相关2
http://www.groad.net/bbs/simple/?f104.html if 函数 if 函数的语法有两种形式: () $(if <condition>, <then ...
- PHP中使用Redis
Redis是什么 Redis ( REmote DIctionary Server ) , 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用 ...
- git+jenkins
开发写代码的演变 一个开发单打独斗,撸代码,开发网站,自由自在 多个开发同时开发一个网站,同时改一份代码.但是同时改一个文件会导致冲突 分支结构,每天上班第一件事克隆代码,下班前最后一件事合并代码 好 ...
- Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法
昨天晚上调试了一晚上,在LinearLayout上接收屏幕动作,可是出现了问题, 以下的代码是本人调的代码 </pre><pre name="code" clas ...