一、題目
二、解法
首先肯定想到我們要把數位和放進狀態中,但是原數會有點棘手。
我們可以先枚舉數位和(也就是模數),設,爲前位,是否頂到上界,數位和爲,餘數爲,我們最後要是 模數,並且,然後就可以轉移了。
#include <cstdio>
#include <cstring>
#define int long long
int read()
{
int x=0,flag=1;char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int L,R,cnt,a[20],dp[20][2][200][200],MOD;
int dfs(int pos,bool equal,int sum,int mod)
{
if(pos==0) return sum==MOD&&mod==0;
int &t=dp[pos][equal][sum][mod];
if(t!=-1) return t;
t=0;
for(int i=0;i<=9;i++)
{
if(equal && i>a[pos]) break;
t+=dfs(pos-1,equal&&i==a[pos],sum+i,(mod*10+i)%MOD);
}
return t;
}
int calc(int num)
{
int res=0;cnt=0;
while(num>0) a[++cnt]=num%10,num/=10;
for(MOD=1;MOD<=cnt*9;MOD++)
{
memset(dp,-1,sizeof dp);
res+=dfs(cnt,1,0,0);
}
return res;
}
signed main()
{
L=read();R=read();
printf("%lld\n",calc(R)-calc(L-1));
}