zoukankan      html  css  js  c++  java
  • X mod f(x) (思维数位dp)

    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 <= 10 9), 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

    2
    1 10
    11 20

    Sample Output

    Case 1: 10
    Case 2: 3

    本题不容易想到的是运用枚举进行对所要凑成的数进行枚举

    这样就可以在数位dp的过程中进行取余操作

    dp数组记录的状态分别是数位 枚举值,当前数位值,余数;

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int dp[11][90][90][90];//数位 枚举值,当前数位值,余数;
    int a[11];
    int dfs(int pos,int lim, int k,int sum,int mod)
    {
        //cout<<pos<<" "<<k<<" "<<sum << " "<<mod<<endl;
        if(pos==0)
        {
            return sum==k&&mod==0;
        }
        if(!lim&&dp[pos][k][sum][mod]!=-1) return dp[pos][k][sum][mod];
        int ans=0,s;
        s=lim?a[pos]:9;
        for(int i=0;i<=s;i++)
        {
            int temp=(mod*10+i)%k;
            ans+=dfs(pos-1,lim&&i==s,k,sum+i,temp);
        }
        if(!lim) dp[pos][k][sum][mod]=ans;
        return ans;
    }
    int solve(long long x)
    {
        int cnt=0;
        while(x!=0)
        {
            ++cnt;
            a[cnt]=x%10;
            x/=10;
        }
        int ans=0;
        for(int i=1;i<=(cnt)*9;i++)
        {
            ans+=dfs(cnt,1,i,0,0);
        }
        return ans;
    }
    int main()
    {
        memset(dp,-1,sizeof(dp));
        int t;
        scanf("%d",&t);
        int cas=0;
        while(t--)
        {
            cas++;
            long long temp1,temp2;
            scanf("%lld%lld",&temp1,&temp2);
            //cout<<solve(temp1)<<" "<<solve(temp2)<<endl;
            printf("Case %d: %d
    ",cas,solve(temp2)-solve(temp1-1));
        }
    }
  • 相关阅读:
    数组作为方法参数时的一些意外情况
    pack://application:,,,/
    WPF 使用WinForm Chart控件
    WPF 后台绑定样式
    在转换为 UTC 时大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法系列化为 JSON
    LINQ_to_SQL语法及实例大全
    C#编码好习惯,献给所有热爱c#的同学
    C#中OpenFileDialog的使用
    NET 2.0(C#)调用ffmpeg处理视频的方法
    SQLite Mysql 模糊查找(like)
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852310.html
Copyright © 2011-2022 走看看