HDU 4389 X mod f(x)

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

2

1 10

11 20

Sample Output

Case 1: 10

Case 2: 3

题意:求区间[l,r] 满足x%f[x]==0的数的个数!!

比较经典的数位动规!

纯枚举肯定会超时!!!

所以这里是通过枚举位数和求的!!!

AC代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

int num[22];
int dp[11][82][82][82];
int mo;

int dfs(int pos,int mo,int sum1,int sum2,bool limit)
{
    int i;
    if(pos==-1) return sum1==mo&&sum2==0;
    if(!limit&&dp[pos][mo][sum1][sum2]!=-1) return dp[pos][mo][sum1][sum2];
    int end = limit ? num[pos] : 9;
    int sum = 0;
    for(i = 0; i <= end; i++)
    {
        sum+=dfs(pos-1,mo,sum1+i,(sum2*10+i)%mo,limit&&i==end);
    }
    return limit ? sum : dp[pos][mo][sum1][sum2] = sum;
}

int solve (int n)
{
    int pos=0;
    int ans=0;
    int i;

    while(n>0)
    {
        num[pos++]=n%10;
        n/=10;
    }
    for(i=1;i<=81;i++)
    {
        ans+=dfs(pos-1,i,0,0,true);
    }
    return ans;
}

int main()
{
    int t;
    int l,r;
    int cas=1;
    scanf("%d",&t);
    memset(dp,-1,sizeof dp);
    while(t--)
    {
        scanf("%d%d",&l,&r);
        printf("Case %d: %d\n",cas++,solve(r)-solve(l-1));
    }
    return 0;
}
时间: 2024-10-31 00:38:51

HDU 4389 X mod f(x)的相关文章

hdu 4389 X mod f(x) 数位dp

题链:http://acm.hdu.edu.cn/showproblem.php?pid=4389 X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2330    Accepted Submission(s): 919 Problem Description Here is a function f(x): int

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 

HDU 4389 X mod f(x) (数位DP)

题目链接  HDU4389 题意  给出T个区间[L, R],统计L到R中有多少个满足条件的数. 限制条件为该数能被这个数的各位数字之和整除. 数据范围$1 <= L <= R <= 10^{9}$ 考虑数位DP 注意到f(x)最大为81,所以对1-81每一个和做一遍数位DP即可. f[pos][mod][sum][x] 表示当前处理到第pos位,当前的数位和对x取模的结果,当前的数位和,以及当前正在求的x = f(x) #include <bits/stdc++.h> us

[数位dp] hdu 4389 X mod f(x)

题意:为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 思路:为了避免状态重复,枚举位数和1~81 dp[site][sum][mod][wsh] 到site位,位数和为sum,对最后位数和为wsh的余数为mod,最后位数和是wsh 枚举1~81 累计就是答案. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #incl

HDU 4389 数位dp

X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2992    Accepted Submission(s): 1171 Problem Description Here is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f (

HDU X mod f(x) (数位DP)

题意:求一个区间内各位数字之和能被该数整除的个数. 析:数位DP,dp[i][j][k][l] 表示前 i 位和为 j,对 k 取模为 l,然后就好做了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include

hdu 4389

求区间内满足x%fx==0的数的个数,fx为该数各个位数上的数字之和Sample Input21 1011 20 Sample OutputCase 1: 10Case 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

HDU-4389 X mod f(x) &amp;&amp; 2018上海大都会邀请赛J 数位dp

题意:给出区间[L,R],求其中有多少个数满足自身被数位和整除 比赛出了刚好没刷的原题系列= = 思路:枚举的过程中很好记录数位和,但是一个数字可以很大(1e9.1e12),不能加到状态里 既然相对很小的量是数位和,考虑枚举最终的数位和作为模数,用它来模过程中得到的数字num,这样num就可以加入状态了 最后只要枚举到的数位和确实是这个模数,就是一个可行解,明确状态之后套模板即可 1 #include<cstdio> 2 #include<cstring> 3 #include&l

HDU 5241 上海大都会 F题

留意到,每一种语言的情况其实是独立的,也就是说,每一种语言的集合的包含的情况都是符合要求的.一种语言在图上可以有32种情况(由数据2知),所以,总的数就是32^n import java.util.*; import java.math.*; public class Main { static public void main(String []args){ Scanner scan=new Scanner(System.in); int T,icase=0; T=scan.nextInt()