hdu 4389 数位dp

时间:2023-03-09 16:52:28
hdu 4389 数位dp

求区间内满足x%fx==0的数的个数,fx为该数各个位数上的数字之和
Sample Input
2
1 10
11 20

Sample Output
Case 1: 10
Case 2: 3

大小不是你想开,想开就能开,汗颜-_-!

 #include<cstdio>
#include<cstring>
using namespace std;
int dp[][][][];
int digit[];
int dfs(int p,int mod,int s,int m,bool e) { //位置,模数,前面之和,当前位数%mod,任意填 if (p==-) return s==mod&&m==;
if (!e &&dp[p][mod][s][m]!=-) return dp[p][mod][s][m];
int res = ;
int u = e?digit[p]:;
for (int d=;d<=u;++d)
{
//printf("%d %d %d %d %d\n",p,mod,s,m,e);
res+=dfs(p-,mod,s+d,(m*+d)%mod,e&&d==u);
}
return e?res:dp[p][mod][s][m]=res;
}
int solve(int n)
{
int len=;
while(n)
{
digit[len++]=n%;
n/=;
}
int ans=;
for(int i=;i<=;i++)
{
ans+=dfs(len-,i,,,);
}
return ans;
}
int main()
{
int t;
int n,m;
//freopen("1.in","r",stdin);
memset(dp,-,sizeof(dp));
scanf("%d",&t);
for(int i=;i<=t;i++)
{
scanf("%d%d",&n,&m);
printf("Case %d: %d\n",i,solve(m)-solve(n-));
}
}