zoukankan      html  css  js  c++  java
  • hdu 4389 数位dp

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

    Sample Output
    Case 1: 10
    Case 2: 3

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

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int dp[10][82][82][82];
     5 int digit[10];
     6 int dfs(int p,int mod,int s,int m,bool e) { //位置,模数,前面之和,当前位数%mod,任意填
     7 
     8     if (p==-1) return s==mod&&m==0;
     9     if (!e &&dp[p][mod][s][m]!=-1) return dp[p][mod][s][m];
    10     int res = 0;
    11     int u = e?digit[p]:9;
    12     for (int d=0;d<=u;++d)
    13     {
    14         //printf("%d %d %d %d %d
    ",p,mod,s,m,e);
    15         res+=dfs(p-1,mod,s+d,(m*10+d)%mod,e&&d==u);
    16     }
    17     return e?res:dp[p][mod][s][m]=res;
    18 }
    19 int solve(int n)
    20 {
    21     int len=0;
    22     while(n)
    23     {
    24         digit[len++]=n%10;
    25         n/=10;
    26     }
    27     int ans=0;
    28     for(int i=1;i<=81;i++)
    29     {
    30         ans+=dfs(len-1,i,0,0,1);
    31     }
    32     return ans;
    33 }
    34 int main()
    35 {
    36     int t;
    37     int n,m;
    38     //freopen("1.in","r",stdin);
    39     memset(dp,-1,sizeof(dp));
    40     scanf("%d",&t);
    41     for(int i=1;i<=t;i++)
    42     {
    43         scanf("%d%d",&n,&m);
    44         printf("Case %d: %d
    ",i,solve(m)-solve(n-1));
    45     }
    46 }
  • 相关阅读:
    1001. 害死人不偿命的(3n+1)猜想 (15)
    单链表排序
    简单插入排序
    简单选择排序
    C语言-随机数
    二分查找(折半查找)
    顺序查找-顺序查找-带哨兵查找
    队列-链表实现
    循环队列_数组实现
    队列-顺序存储-简单实现
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4262674.html
Copyright © 2011-2022 走看看