HDU4734 F(x) 题解 数位DP】的更多相关文章

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题目大意: 对于一个 \(n\) 位十进制数 \(x\) (\(A_nA_{n-1}A_{n-2} \cdots A_2A_1\)),我们定义 \[F(x)=A_n \times 2^{n-1} + A_{n-1} \times 2^{n-2} + \cdots + A_2 \times 2 + A_1 \times 1\] 现在给你两个数 \(A\) 和 \(B\) ,请计算出区间 \([0…
>传送门<题意:对于一个有n位(这n位从高位到低位分别是An,An-1,An-2 ... A2,A1)的十进制数,我们定义它的权值F(x)=An*2n-1 + An-1*2n-2 + ... + A2*2 + A1*1.现在给你两个数A,B,请计算[0,B]范围内有多少个权值<=F(A)的数 思路:(这个下面文字是有点多,可能是我太弱了,在刚开始学的时候只有这样我才能理解QAQ~) 其实F(x)只是给每一个数位带上一个权值v = 2^(p-1),F(x)最大是值不会超过5000,我们完全…
(如此简短的题目给人一种莫名的压迫感......) 题目中定义一个数的权值求解函数:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. 观察可知:权值的表达式与数的位数相关,再加上要分离每个位上的数字,那么就不难想到数位DP了. dp[pos][j]表示pos位下小等于j的元素个数,代码如下: 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 c…
题意 先定义了一个函数F(X)=An*2^n-1+An-1*2^n-2+.....+A1*1.其中Ai为X的第i位的值.对于每组数据给出了两个整数A,B.问不超过B的数中有多少的F值是不超过F(A)的. 分析 经过计算我们发现,F(A)最大不会超过5000,于是我们可以把它加到记忆化里面.我们令dp[p][sum]为前p位数中不超过sum的数位多少.那么转移是很显然的 dp[p][sum]+=dp[p-1][sum-i*(1<<(p-1))] 但是到这里还不是重点!重点是这个题有一个必须要明白…
这道题还是关于数位DP的板子题 数位DP有一个显著的特征,就是求的东西大概率与输入关系不大,理论上一般都是数的构成规律 然后这题就是算一个\( F(A) \)的公式值,然后求\( \left [ 0 ,  B \right ] \)区间内\( F(x) \)不大于\( F(A) \)的数的个数 所以由数据范围很容易得到计算出最大值不会超过4600 然后我们设状态\( dp[10][4600][4600] \)表示不同\( F(A) \)取值下的第\( pos \)个位置的值总和为 \( sumx…
(https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65608478) Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given…
Problem F. Fibonacci SystemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=86821#problem/B Description Little John studies numeral systems. After learning all about fixed-base systems, he became inte…
For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n * 2 n-1 + A n-1 * 2 n-2 + ... + A 2 * 2 + A 1 * 1. Now you are given two numbers A and B, please calculate how many numbers are there between 0 and B,…
http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状态怎么构造,太弱了我. 言归正传,数位和有81种状态,怎么判断当前数字是否被整除呢?可以利用余数的思想,至此,定义状态dp[pos][sum][mod][res]表示前pos位的数位和为sum模mod的结果为res的个数,采用记忆化搜索比较简洁. #include<iostream> #inclu…
题目链接 https://www.luogu.org/problemnew/show/P2657 分析 第一道数位DP题,发现有点意思 DP求\([L,R]\)区间内的XXX个数,很套路地想到前缀和,先求\([1,R],[1,L]\)相减就好了 状态转移也明确,发现状态只和上一位数位的数有关,\(f[i][j]\)表示第\(i\)位放\(j\)的话有多少个windy数,注意的这里的windy数是在钦定一个数字最高位是多少情况下所有的windy数的数量和(即[1,i-1]位放数情况都被算了一遍)…
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 数位DP 进行求解. 定义一个结构体数组 \(f[pos][all0]\) 表示满足如下条件时 \(0 \sim 9\) 出现的次数: 当前所在数位为第 \(pos\) 位: \(all0\) 为 \(1\) 表示当前状态之前一直都是前置 \(0\) ,为 \(0\) 表示前面的数位上面出现过不为…
题目链接:https://www.luogu.com.cn/problem/P3413 题目大意: 定义萌数指:满足"存在长度至少为2的回文子串"的数. 求区间 \([L,R]\) 范围内萌数的数量. 解题思路: 使用 数位DP 进行求解. 定义状态 \(f[pos][p1][p2]\) 表示满足如下条件时的方案数: 当期数位在第 \(pos\) 位: 前面那个数的前面那个数是 \(p1\): 前面那个数是 \(p2\). 则可以开函数 dfs(int pos, int p1, int…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasing subsequence,简称LIS)长度为 \(k\) 的数的数量. 举个例子: \(123\) 的LIS只有一个\(123\),所以它的LIS的长度是 \(3\): \(101\) 的LIS只有一个\(01\),所以它的LIS的长度是 \(2\): \(132\) 的LIS有\(13\)和\(…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意: 找到区间 \([L,R]\) 范围内所有满足如下条件的数的 平方和 : 不包含'7': 不能被 7 整除: 各位之和不能被 7 整除. 注意:求的是满足条件的数的 平方和 ! 解题思路: 使用 数位DP 尽情求解. 但是因为这里求的是满足要求的元素的平方和,而不是元素的个数. 所以我们不能简单地开long long来存放结果, 而是开一个结构体来存放结果,结构体中需要包含三个元素:…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题目大意: 求区间 \([x, y]\) 范围内"平衡数"的数量. 所谓平衡数是指:以某一位为支点,它左边的所有位的数乘以它到支点的距离之和等于它右边的所有位的数乘以它到支点的距离之和. 比如, \(4139\) 是平衡数,因为以 \(3\) 为支点, 左边的每一位数与距离的乘积和为 \(4 \times 2 + 1 \times 1 = 9\): 右边的每一位数与距离的乘积和为 \…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题目大意: 求区间 \([1, n]\) 范围内包含连续的数位"13"并且能被13整数的数的数量. 解题思路: 使用 数位DP 进行求解. 开一个状态 \(f[pos][pre][num][flag]\) ,用于表示: 当前所处的数位为第 pos 位: 之前所有的数位模13的余数为 pre: 当前数位的前一位(即第 pos+1 位)为 num: flag 用于表示当前数位的前面那些位…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5179 题目大意: 给你一个数 \(A = a_1a_2 \cdots a_n\) ,我们称 \(A\) 为"漂亮的数"当且仅当 \(a[i] \ge a[i+1]\) (\(1 \le i \lt n\)) 并且 \(a[i]\) mod \(a[j] = 0\) (\(1 \le i \lt n, i \lt j \le n\)),比如 \(931\) 就是一个漂亮的数. 求区间 \([…
题目大意: 求区间 \([x,y]\) 范围内有多少数的二进制表示中的'0'的个数 \(\ge\) '1'的个数. 解题思路: 使用 数位DP 解决这个问题. 我们设状态 f[pos][num0][num1][all0] 表示在: 当前所在数位为 pos : 当前选择的'0'的个数为 num0: 当前选择的'1'的个数为 num1: 到当前位位置是不是前面的数都是前导零(如果都是前导0则 all0==true,否则 all==false). 下的方案数. 我们开函数 dfs(int pos, i…
题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying in the set \([X;Y]\) and being a sum of exactly \(K\) different integer degrees of B. Example. Let \(X=15, Y=20, K=2, B=2\) . By this example 3 number…
题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分析: 这道题目使用 数位DP 进行求解. 这里有两个条件: 不含前导零: 相邻两个数字之差至少为2. 所以我们需要确定的是,对于当前状态: 他的前一位的数字是啥: 他的前面是不是都是前导0. 我们可以开一个函数 dfs(int pos, int pre, bool all0, bool limit)…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:求 \([1,n]\) 范围内有多少数包含"49". 解题思路: 这个问题我们可以分两种解法来考虑:第一种是求不包含"49"的数的数量,用后减一下:另一种就是直接求包含"49"的数的数量. 解法1:求多少数不包含"49" 这种方法我们先通过数位DP求出 \([0,n]\) 区间范围内有多少数不包含"49&…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目大意:求区间 \([l,r]\) 范围内不包含数字"4"且不包含连续的数字"62"的数的数量. 解题思路: 数位DP 入门题. 我们开一个函数 dfs(int pos, int stat, bool limit) ,其中: pos表示目前将要访问的数的位置: pre表示前一个值是不是6,因为这里涉及到62连数(而单个4不需要存储之前的状态, stat \(=1…
一.题意 给定一个区间[a, b](注意输入的时候可能a > b,所以,在数据输入后,要先比较a和b,如果a > b,交换a和b的值),统计这个区间里面,数位上有多少个0.多少个1.--.多少个9. 二.思路 第一种:数位DP.dfs函数的参数列表为: int pos:当前处理的数位所在的位置: int val:当前统计的数值(0--9): int amt:从最高位开始到当前位置的前一个位置(因为当前位置还没开始统计),val的数量. bool lead:是否有前导0.因为这题要统计0的个数,…
>传送门< 题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 思路:数位dp 就是数位上不能有4也不能有连续的62,没有4的话在枚举的时候判断一下,不枚举4就可以保证状态合法了,所以这个约束没有记忆化的必要,而对于62的话,涉及到两位,当前一位是6或者不是6这两种不同情况我计数是不相同的,所以要用状态来记录不同的方案数.dp[pos][sta]表示当前第pos位,前一位是否是6的状态,这里sta只需要去0和1两种状态就可以了,不是6的情况可视为同种,不会影响计数. Code…
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 …
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题意:我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~b有多少个不大于f(a)的数 显然这题可以设这样的dp dp[len][count]表示前len位权值为count的有多少,然后显然的在len==0时return count>=f(a); 但是这样…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3886 题目大意: 给一定区间 \([A,B]\) ,一串由 /, \ , - 组成的符号串.求满足符号串要求的数字个数. 要求如下: / 表示数字从左到右递增: \ 表示数字从左到右递减: - 表示数字从左到右相等. 第一状态 \(f[pos][id][pre][all0]\) 表示当前处在如下情况下的方案数: 当前所在数位为 pos 位: 当前数位对应字符串 s 的第 id 个元素 s[id]:…
题意:  一个非负整数的十进制位是这样的 (AnAn-1An-2 ... A2A1),定义F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1.给出A和B,问[0,B]中有几个整数x的F(x)值<=F(A)? 思路: 算一下就知道F(x)值不会超过512*9,而B仅仅有8位十进制数,那么8*512*9就可以算出所有的统计了.对于每个询问,先计算F(A)的值,然后统计小于此值有几个就行了.统计的复杂度也是很低的.若是以前缀和来统计后面的个数的…
题目描述 对于一个非负整数 $x=​​\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+a_1·2^0=\sum\limits_{i=1}^na_i·2^{i-1}$ 多次询问 $[0,B]$ 区间内 $F$ 值小于等于 $F(A)$ 的数的个数. 输入 The first line has a number T (T <= 10000) , indicating the number…
题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T <= 50),然后接下来的T行表示T个case;每个case在一行内包含两个正整数L, R(1 <= L <= R <= 10^18). 输出 请计算[L,R]中和7无关的数字的平方和,并将结果对10^9 + 7 求模后输出. 样例输入 31 910 1117 17 样例输出 2362…