zoukankan      html  css  js  c++  java
  • HDU 4389——X mod f(x)(数位DP)

    X mod f(x)

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

    Problem Description

    Here is a function f(x):
       int f ( int x ) {
           if ( x == 0 ) return 0;
           return f ( x / 10 ) + x % 10;
       }


       Now, you want to know, in a given interval [A, B] (1 <= A <= B <= 109), how many integer x that mod f(x) equal to 0.

    Input

       The first line has an integer T (1 <= T <= 50), indicate the number of test cases.
       Each test case has two integers A, B.

    Output

       For each test case, output only one line containing the case number and an integer indicated the number of x.

    Sample Input

    21 10

    11 20

     

    Sample Output

    Case 1: 10

    Case 2: 3

    ————————————————————————切割线—————————————————————

    记忆化搜索:

    数据范围是10的9次方。数位和最大为9*9=81,枚举数位和

    每次要维护:pos维数,当前数位和a。枚举的数位和b。当前的模mo。有无上限e

    dp [pos] [a] [b] [mo];


    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<map>
    #include<set>
    #include<cmath>
    #include<cstdlib>
    #include<cctype>
    #define inf 0x3f3f3f3f
    #define maxn 10000
    typedef long long LL;
    using namespace std;
    int dp[11][82][82][82];
    int num[11],pos,n,m;
    int dfs(int pos,int a,int b,int mo,int e)
    {
        if(pos==-1) return a==b&&!mo;
        if(!e&&dp[pos][a][b][mo]!=-1) return dp[pos][a][b][mo];
        int end=e?num[pos]:9;
        int sum=0;
        for(int i=0;i<=end;i++){
            sum+=dfs(pos-1,a+i,b,(mo*10+i)%b,e&&i==end);
        }
        return e?sum:dp[pos][a][b][mo]=sum;
    }
    void Init(int x)
    {
        pos=0;
        while(x){
            num[pos++]=x%10;
            x/=10;
        }
    }
    int cal(int x)
    {
        Init(x);
        int res=0;
        for(int i=1;i<=81;i++){
            res+=dfs(pos-1,0,i,0,1);
        }
        return res;
    }
    int main()
    {
        int t,iCase=1;
        memset(dp,-1,sizeof dp);
        cin>>t;
        while(t--){
            scanf("%d%d",&m,&n);
            printf("Case %d: %d
    ",iCase++,cal(n)-cal(m-1));
        }
    
    	return 0;
    }
    



     

  • 相关阅读:
    python全栈开发 * 继承性 层叠性 盒模型 标准文档流 * 180809
    python全栈开发 * css 选择器 浮动 * 180808
    python全栈开发 * 表格标签 表单标签 css 引入方式 * 180807
    python全栈开发 * 线程队列 线程池 协程 * 180731
    saltstack的jinjia模板
    saltstack cmd状态模块和条件判断
    saltstack 配置管理之状态间关系
    saltstack lamp自动化案例实战
    saltstack 配置管理之状态模块
    saltstack 远程执行之返回写入到mysql
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5346471.html
Copyright © 2011-2022 走看看