(图片上传失败???不知道什么原因)
原题:https://www.lydsy.com/JudgeOnline/problem.php?id=1799
题解
因为是10^18所以各位数字加起来最大也不超过9*18所以我们就可以一次枚举啊
判断是否整除就在每次构造数字的时候mod一下各位数字加起来的数字,如果最后结果为0的话说明可以整除。
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll L,R,f[20][200][200];
int rec[20][200][200],a[20],ToT,mod;
ll dfs(int i,int s,int d,int b)
{
if (!i) return (!s)&&(!d);
if ((!b)&&rec[i][s][d]==mod) return f[i][s][d];
ll ret=0;int l=max(0,s-9*(i-1)),r=min(b?a[i]:9,s);
for (int j=l;j<=r;j++) ret+=dfs(i-1,s-j,(d*10+j)%mod,b&(a[i]==j));
if (!b) rec[i][s][d]=mod,f[i][s][d]=ret;
return ret;
}
ll solve(ll x)
{
ll ret=0;ToT=0;
memset(a,0,sizeof(a));
for (;x;x/=10) a[++ToT]=x%10;
for (mod=1;mod<=9*ToT;mod++) ret+=dfs(ToT,mod,0,1);
return ret;
}
int main()
{
scanf("%lld%lld",&L,&R);
printf("%lld\n",solve(R)-solve(L-1));
return 0;
}