hdu 4389

求区间内满足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\n",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\n",i,solve(m)-solve(n-1));
45     }
46 }
时间: 2024-10-30 03:13:47

hdu 4389的相关文章

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)

题目链接  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

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 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)

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 gi

[数位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

数位DP合集

1.HDU 4722 good numbers: 题意:给出一个区间[A,B],求出区间内有多少个数的各位的和加起来模10等于0的数有多少个. 解法:这是一个数位DP简单入门题,简单的DFS+数组记忆化搜索就可以.姿势是自己写的..感觉略搓,做到第三个数位DP题的时候看到了别人的姿势,学习了. 代码: #include <iostream> #include <cstdio> #include <stack> #include <cstring> #incl

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include