解题思路
设计状态 f[len][sum][res] 表示已经做了
l
e
n
len
len位,当前的和是
s
u
m
sum
sum ,摸掉模数后剩下的数是
r
e
s
res
res,
那么我们直接暴力枚举模数, l e n = 0 len=0 len=0 最后判断一下是否 s u m = m o d sum=mod sum=mod && r e s = 0 res=0 res=0 这个时候可以吧答案返回为 1 1 1。
那么再套个板子就。。。
洛古id.
代码
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int l,r,f[11][90][90],c[25];
int dp(int len,int limit,int sum,int x,int res){
if(!len){
if(res==0)return (sum==x)?1:0;
return 0;
}
if(!limit&&f[len][sum][res]!=-1)return f[len][sum][res];
int ssum=0,maxx=(limit)?c[len]:9;
for(int i=0;i<=maxx;i++)
{
ssum+=dp(len-1,(i==maxx)&&limit,sum+i,x,(res*10+i)%x);
}
return f[len][sum][res]=ssum;
}
int solve(int a)
{
int pos=0,ans=0;
while(a)
{
c[++pos]=a%10;
a/=10;
}
for(int mod=1;mod<=9*pos;mod++)
{
memset(f,-1,sizeof(f));
ans+=dp(pos,1,0,mod,0);
}
return ans;
}
int main(){
while(~scanf("%lld%lld",&l,&r))
{
printf("%lld\n",solve(r)-solve(l-1));
}
}
??这道题YBTOJ上交超时了,只有20分,因为数据有3000组。。
所以我就是来水博客的。。哈哈哈。。