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_自己定义切换控件SwitchView
1.示意图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemltbzIwMTM=/font/5a6L5L2T/fontsize/400/fill/I0JB ...
- Codeforces初体验
Codeforces印象 这两天抽时间去codeforces体验了一把. 首先,果然有众多大牛存在.非常多名人一直參加每周一次的比赛.积分2000+,并參与出题. 另外.上面题目非常多.预计至少一千题 ...
- windows ffmpeg 推送摄像头数据到rtmp服务
文本主要讲述windows系统下如何利用ffmpeg获取摄像机流并推送到rtmp服务,命令的用法前文 中有讲到过,这次是通过代码来实现.实现该项功能的基本流程如下: 图1 ffmpeg推流流程图 较前 ...
- Logical Volume Manager (Linux)
http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) Logical Volume Manager (Linux) From Wiki ...
- idea主要设置大纲图
idea修改主题和字体大小: 对菜单栏进行调整,不过貌似没什么用: 一般设置:
- Android.mk: recipe commences before first target. Stop.
[GUIDE] Setup Android Development Environment on Ubuntu 14.04 Trusty Tahr Hi All, This originally wa ...
- kubernetes对象之cronjob
系列目录 类似于Linux的Cron模块,CronJob用来运行定时性任务,或者周期性.重复性任务.注意CronJob启动的是kubernetes中的Job,不是ReplicaSet.DaemonSe ...
- caffe搭建以及初步学习--win7-vs2013-gtx650tiboost-cuda8.0-cifar10训练和测试-2-快速解决方案cifar10_quick_solver.prototxt
首先安装好显卡----已经装好了?喜大普奔!没装好?那就用cpu,也是一样的. 拷贝cudnn v5.0 头文件和库文件以及执行文件到cuda8中 -------------------------- ...
- Struts2拦截器 解决登录问题
一.了解Struts2 拦截器[Interceptor] 拦截器的工作原理如图 拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次 ...
- Struts2实例详解(转载)
Struts2(上) 一. 经典的MVC模式 二. Struts1.x对MVC的实现 三. Struts1.x的主要组件和作用 组件 作用 ActionSer ...