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

题意:给出区间【L,R】,求其中有多少个数满足自身被数位和整除

比赛出了刚好没刷的原题系列= =

思路:枚举的过程中很好记录数位和,但是一个数字可以很大(1e9、1e12),不能加到状态里

既然相对很小的量是数位和,考虑枚举最终的数位和作为模数,用它来模过程中得到的数字num,这样num就可以加入状态了

最后只要枚举到的数位和确实是这个模数,就是一个可行解,明确状态之后套模板即可

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 int a[10], dp[10][90][90][90];
 7
 8 int dfs(int pos, int sum, int mod, int res, bool lim){
 9     if (pos == -1) return (sum == 0 && res == mod);
10     if (!lim && dp[pos][sum][mod][res] != -1) return dp[pos][sum][mod][res];
11     int r = lim ? a[pos] : 9;
12     int ans = 0;
13     for (int i = 0; i <= r; i++){
14         ans += dfs(pos-1, (sum*10+i)%mod, mod, res+i, lim && i == a[pos]);
15     }
16     if (!lim) dp[pos][sum][mod][res] = ans;
17     return ans;
18 }
19
20 int solve(int x){
21     int pos = 0;
22     while (x){
23         a[pos++] = x%10;
24         x /= 10;
25     }
26     int ans = 0;
27     for (int i = 1; i <= 81; i++)
28         ans += dfs(pos-1, 0, i, 0, 1);
29     return ans;
30 }
31
32 int main(){
33     int t, a, b, kase = 0;
34     scanf("%d", &t);
35     memset(dp, -1, sizeof dp);
36     while (t--){
37         scanf("%d%d", &a, &b);
38         printf("Case %d: %d\n", ++kase, solve(b)-solve(a-1));
39     }
40     return 0;
41 }

原文地址:https://www.cnblogs.com/QAQorz/p/9355200.html

时间: 2024-10-28 09:18:16

HDU-4389 X mod f(x) && 2018上海大都会邀请赛J 数位dp的相关文章

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

HDU - 4507 吉哥系列故事――恨7不成妻 (数位DP)

Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7*11 最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数! 什么样的数和7有关呢? 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关―― 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数

HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)

题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关: 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 给定一个区间[L,R],问在此区间内和7无关的所有数字的平方和. 思路: 第一步好解决,只是数位DP的基础.第二步是十进制的所有位加起来是7的整数倍,这个只是需要用多一维来记录%7的结果就行了.第三步是7的整数倍问题,假设c=a+b,那么c%7=(a%7+b)%7,就假设这个数是10086,那么(10000%7+86)%7就行了,

HDU ACM 4507 吉哥系列故事——恨7不成妻 -&gt;数位DP

题意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关-- 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和. 分析:数位DP,关键内容如下. (pre0+i)%7用于处理各个位数之和时候为7的倍数,(pre1*10+i)%7用于处理这个数是否为7的倍数. #include<iostream> using namespace std; const __int64 mod=100

HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 求一定区间内和7无关的数字的平方和. 解题思路:这里我们用一个结构体分别存储符合条件的数的个数n,从当前位开始至末尾的数值s(比如一个数当前为1234***,*表示还不知道的位值,代表的就是***),从当前位开始至末尾的数的平方