题目: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的更多相关文章

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

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

  2. BZOJ1799 self 同类分布 数位dp

    BZOJ1799self 同类分布 去博客园看该题解 题意 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. [约束条件]1 ≤ a ≤ b ≤ 10^18 题解 1.所有的位数之和&l ...

  3. BZOJ1799 [Ahoi2009]self 同类分布[数位DP]

    求出[a,b]中各位数字之和能整除原数的数的个数. 有困难的一道题.被迫看了题解:枚举每一个各位数字的和($<=162$),设计状态$f[len][sum][rest]$表示dp后面$len$位 ...

  4. bzoj 1799: [Ahoi2009]self 同类分布 数位dp

    1799: [Ahoi2009]self 同类分布 Time Limit: 50 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Descripti ...

  5. BZOJ 1799 同类分布(数位DP)

    给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.1<=a<=b<=1e18. 注意到各位数字之和最大是153.考虑枚举这个东西.那么需要统计的是[0,a-1]和[0,b ...

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

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

  7. 数位dp 笔记

    目录 数位dp 笔记 解决的问题 & 主体思想 入门 -- windy数 绕一个弯 -- 萌数 the end? -- 恨7不成妻 小心细节 [SDOI2016]储能表 复杂度起飞 [AHOI ...

  8. [BZOJ1799][Ahoi2009]self 同类分布(数位dp)

    题目描述 给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数. 输入输出格式 输入格式: 一行,两个整数 aa 和 bb 输出格式: 一个整数,表示答案 输入输 ...

  9. 【数位dp】bzoj1799: [Ahoi2009]self 同类分布

    各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...

随机推荐

  1. log4j:WARN Please initialize the log4j system properly解决的方法

    要解决问题很easy,建立LOG4J 的配置文件就可以. 在src 文件夹下创建配置文件,选 一.择菜单File > New > File,文件名称输入log4j.properties,文 ...

  2. vue2.0 vue-router

    一.SPA中路由的简单实现 main.js import Vue from 'vue' import App from './App' import VueRouter from 'vue-route ...

  3. 分享ArcGIS Server 10.0修复安装心得

    最近,捣腾了一阵子在xp系统上安装ArcGIS Server10.0(下方均简称server),解决了一些初学者可能面临的problem,给大家贴出来, 希望能够给初学者一些有益的帮助. 我的系统环境 ...

  4. enter键触发的函数

    enter键触发的函数示例: <input type="text" onkeydown="fun();"> function fun() { if( ...

  5. python 调用函数时使用星号 *, **

    python 调用函数时使用星号 *, ** 调用函数时使用星号 * 或 ** test(*args):* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去.如果 args 等于 (1 ...

  6. MySQL优化之——日志

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46790451 MYSQL里的日志主要分为4类,使用这些日志文件.能够查看MYSQL ...

  7. 关于error:Cannot assign to &#39;self&#39; outside of a method in the init family

    有时候我们重写父类的init方法时不注意将init后面的第一个字母写成了小写.在这种方法里面又调用父类的初始化方法(self = [super init];)时会报错,错误信息例如以下:error:C ...

  8. 图像处理之opencv---加减乘除运算cvdiv

    http://chyyeng.blog.163.com/blog/static/16918230201211632135456/

  9. WPF 后台Render线程崩溃, Exception from HRESULT: 0x88980406

    近期遇到一个问题.窗口在Loaded同一时候Resize会出现黑屏或者直接崩溃, 调查发现是WPF后端的Render线程渲染UI到DirectX时崩溃. 硬件环境:WES7 + .Net4.0 关于W ...

  10. Eclipse-----Eclipse断点调试