【数位统计】之【spoj1433 KPSUM】】的更多相关文章

把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容:  a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits.    问一个区间内[l,r]有多少个Beautiful数字    范围9*10^18        数位统计问题,构造状态也挺难的,我想不出,我的思维局限在用递推去初始化状态,而这里的状态定义也比较难    跟pre的…
1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine the amount of integers, lying in the set [X;Y] and being a sum of exactlyK different integer degrees of B. Example. Let X=15, Y=20, K=2, B=2. By this exampl…
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种,它以“区间长度”作为DP的“阶段”,使用两个坐标(区间的左.右端点)描述每个维度.在区间DP中,一个状态由若干个比它更小且包含于它的区间所代表的状态转移而来,因此区间DP的决策往往就是划分区间的方法.区间DP的初态一般就由长度为1的“元区间”构成. 下面介绍一道经典题:石子合并 题目描述: 设有N堆石子排成一…
[spoj1433]KPSUM 来源 高逸涵<数位计数问题解法研究> 由于自己的数位计数类的问题实在太差了,所以把例2用markdown抄写并补充了一遍. 题意 将写在纸上,然后在相邻的数字间交替插入"+"和"-",求最后的结果.例如当时,答案为: 分析 这是一道稍微复杂一点的数位计数问题. 我们首先探查数位确定,所有数字自由的情况. 不妨设第一位从"+"开始. 若数位个数为偶数,以6位为例: +0 -0 +0 -0 +0 -0 +0…
Description 用+-号连接1-n所有数字的数位,问结果是多少. Sol 数位DP. \(f[i][j][0/1][0/1]\) 表示长度为 \(i\) 的数字,开头数字是 \(j\) ,是否有前导0(这个会影响符号),每相邻两组数符号是否相同. 转移开一下代码吧. 这道题的符号有点乱,所以转移看起来有些乱...其实只有3个状态,没前导0,有前导0相邻两个数符号相同,有前导0相邻两个数符号不同. 没前导0的只有在第一次统计才会用到. 我发现自己写数位DP就是写小于 \(n\) 的,所有都…
KPSUM - The Sum One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that he placed signs + and - between every pair of adjacent digits alternately. Now he wants to find the value of the expression he has made. Help him. For…
怎么说,数位DP还是我的噩梦啊,细节太恐怖了. 但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少) poj3208 f[i][0~2]表示第i位,开头连续j个6的情况数,[3]表示魔鬼数的个数,这样可以方便得出区间内有多少魔鬼数,不停的试填到底即可. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib…
这道题的题解有几个亮点 一个是每次只统计一个数字来简化思维 一个是统计当前位数的时候分三个部分来更新答案 具体看代码,有注释 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namespace std; const int MAXN = 10; int pow[MAXN], cnt[MAX…
AcWing Description Sol 看了很久也没有完全理解直接$DP$的做法,然后发现了记搜的做法,觉得好棒! 这里是超棒的数位$DP$的记搜做法总结   看完仿佛就觉得自己入门了,但是就像文中写的,还是要多做题才能真正弄明白鸭,还要加油(ง •_•)ง 然后这里是同一个人的本题题解 Code #include<iostream> #include<cstdio> #include<cstring> #define il inline #define Rg r…
Poj  AcWing Description Sol  这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i][3]$表示由$i$位数字构成的魔鬼数有多少个,$F[i][j](0<=j<=2)$表示由$i$位数字组成的,开头有$j$个$6$的非魔鬼数有多少个.注意,在计算$F[i][j]$时允许前导$0$的存在 $F[i][0]=9*(F[i-1][0]+F[i-1][1]+F[i-1][2])$ $F[…