题目: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 ;
}

最新文章

  1. javascript的执行和预解析
  2. Android annotations REST
  3. 【Tarjan】+【SPFA】APIO2009 Atm
  4. SQL Server 2008 清空删除日志文件
  5. Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
  6. 100 doors
  7. angular-tour 用户新手引导
  8. js中的SetTimeOut
  9. js基本类型
  10. JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
  11. 【HighCharts系列教程】五、版权属性——Credits
  12. [转]ubuntu下安装fiddler
  13. Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据
  14. vue中如何使用mockjs摸拟接口的各种数据
  15. oracle树形结构全路径查询
  16. C语言数组一种巧妙的使用方式
  17. 深入理解Java虚拟机(笔记)
  18. 全志A33 lichee 搭建Qt App开发环境编写helloworld
  19. redis安全删key脚本(模糊匹配,长list,大set等)
  20. 从YOLOv1到YOLOv3,目标检测的进化之路

热门文章

  1. Resolving &#39;Root Partition Is Filling Up&#39; Issue on Sophos UTM Firewall
  2. 翻翻git之---有用的欢迎页开源库 AppIntro
  3. 使用Golang利用ectd实现一个分布式锁
  4. 基于Redis缓存的Session共享测试(转)
  5. css实现弹出窗体始终垂直水平居中
  6. UVa11234 表达式
  7. Canvas学习笔记——动画中的三角学
  8. swift3.0系列完整demo代码库
  9. 我在开发第一个Swift App过程中学到的四件事
  10. EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)