hdu4389 数位dp五(能被各位数之和整除)

所有位和最大为81,枚举x为1-81即和为x且该数能被x整除。。卡内存过===

 1 #include<stdio.h>
 2 #include<string.h>
 3 int num[15];
 4 int dp[11][82][82][82];
 5 int dfs(int pos,int sum,int lsum,int mod,int limit)
 6 {
 7     if (pos==0) return sum==lsum&&mod==0;
 8     if (!limit&&dp[pos][sum][mod][lsum]!=-1)
 9         return dp[pos][sum][mod][lsum];
10     int i,tmp=limit?num[pos]:9,ans=0;
11     for (i=0;i<=tmp;i++)
12         ans+=dfs(pos-1,sum+i,lsum,(mod*10+i)%lsum,limit&&i==tmp);
13     if (!limit)
14         dp[pos][sum][mod][lsum]=ans;
15     return ans;
16 }
17 int cal(int x)
18 {
19     int cnt=0,ans=0,i;
20     while (x!=0){
21         num[++cnt]=x%10;
22         x/=10;
23     }
24     for (i=1;i<=81;i++){
25         ans+=dfs(cnt,0,i,0,1);
26     }
27     return ans;
28 }
29 int main()
30 {
31     int T,t,l,r;
32    // freopen("1001.in","r",stdin);
33    // freopen("1002.out","w",stdout);
34     scanf("%d",&T);
35     memset(dp,-1,sizeof(dp));
36     for (t=1;t<=T;t++)
37     {
38         scanf("%d%d",&l,&r);
39         printf("Case %d: %d\n",t,cal(r)-cal(l-1));
40     }
41 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4389

转载于:https://www.cnblogs.com/xiao-xin/articles/4129250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值