【数位统计】之【spoj1433 KPSUM】
【spoj1433】KPSUM
来源
高逸涵《数位计数问题解法研究》
由于自己的数位计数类的问题实在太差了,所以把例2用markdown抄写并补充了一遍。
题意
将写在纸上,然后在相邻的数字间交替插入“+”和“-”,求最后的结果。例如当时,答案为:
分析
这是一道稍微复杂一点的数位计数问题。
我们首先探查数位确定,所有数字自由的情况。
不妨设第一位从”+”开始。
若数位个数为偶数,以6位为例:
| +0 | -0 | +0 | -0 | +0 | -0 |
| +0 | -0 | +0 | -0 | +0 | -1 |
| +0 | -0 | +0 | -0 | +0 | -2 |
| … | … | … | … | … | … |
| +9 | -9 | +9 | -9 | +9 | -9 |
发现:
①每个数位的符号相同,奇数符号的数位和偶数符号的数位个数相等。
②每个数位中每个数出现的次数相同。
所有数位的所有数的和为0。
若数位个数为奇数,以5位为例:
| +0 | -0 | +0 | -0 | +0 |
| -0 | +0 | -0 | +0 | -1 |
| +0 | -0 | +0 | -0 | +2 |
| -0 | +0 | -0 | +0 | -3 |
| … | … | … | … | … |
| +9 | -9 | +9 | -9 | +8 |
| -9 | +9 | -9 | +9 | -9 |
相邻两行的和为-1。
之前我们这样认定:
不妨设第一位从”+”开始。
然而第一位不一定是+,这跟总位数有关。
注意:当前我们考虑的只是后面位对答案的贡献,前缀对答案的贡献并没有计算。
(1)当为偶数时
①当为偶数时,后面位数的贡献为0;
②当为奇数时,从第位开始贡献为0,所以我们只需要考虑第位的贡献。
第位的全是负号,贡献为:
(2)当为奇数时,相邻两行和为-1,总共有个数,所以有行,所以贡献为:
于是我们写出函数GetSum1。
LL GetSum1(int n,int k)
//n为自由位个数,k为总位数
{
if (k%2==0)
{
if (n%2==0) return 0;
else
{
LL d=-45;
rep(i,1,n-1) d*=10;
return d;
}
}
else
{
LL d=-1;
rep(i,1,n) d*=10;
return d/2;
}
}
接下来,考虑带前缀的情况。总位数=前缀位+自由位。
(1)当总位数为偶数时,前缀符号不变,乘上总行数即可。
(2)当总位数为奇数时,前缀两两相消。
依照以上分析编写GetSum2。
LL GetSum2(LL prefix,int n)
//prefix为前缀,n为自由位个数
{
int d=0,t=1;
LL p=prefix,presum=0;
while (p>0)
{
presum+=(p%10)*t;
p/=10;
d++;
t=-t;
}
presum*=-t;
rep(i,1,n) presum*=10;
LL ret=GetSum1(n,n+d);
if ((d+n)%2==0) ret+=presum;
return ret;
}
沿用上例的思路,,再有了上述两个函数之后,我们继续将整个区间划分为若干段,分别利用上述函数求和,这里不再重复叙述。
小结
通过对问题从简单到复杂的层层递进分析,逐步将程序实现,使得一个原本比较复杂的问题轻松被解决。程序编写过程中思路明确,程序模块化合理,每个模块功能明确,并且单独可以通过check函数进行检验。使得出错的可能性大大降低。
虽然整体代码量有所增加,但由于思考的时间减少,代码编写时间甚至还会缩短。
【数位统计】之【spoj1433 KPSUM】的更多相关文章
- Codeforces 55D Beautiful Number (数位统计)
把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容: a positive integer number is beautiful if and only if it is ...
- [ACM] ural 1057 Amount of degrees (数位统计)
1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine the am ...
- 动态规划——区间DP,计数类DP,数位统计DP
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...
- BZOJ 1236: SPOJ1433 KPSUM
Description 用+-号连接1-n所有数字的数位,问结果是多少. Sol 数位DP. \(f[i][j][0/1][0/1]\) 表示长度为 \(i\) 的数字,开头数字是 \(j\) ,是否 ...
- 数位DP:SPOJ KPSUM - The Sum
KPSUM - The Sum One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that ...
- 0x5C 数位统计DP
怎么说,数位DP还是我的噩梦啊,细节太恐怖了. 但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少) poj3208 f[i] ...
- 紫书 例题 10-22 UVa 1640(数位统计)
这道题的题解有几个亮点 一个是每次只统计一个数字来简化思维 一个是统计当前位数的时候分三个部分来更新答案 具体看代码,有注释 #include<cstdio> #include<cs ...
- $BZOJ1799\ Luogu4127$ 月之谜 数位统计$DP$
AcWing Description Sol 看了很久也没有完全理解直接$DP$的做法,然后发现了记搜的做法,觉得好棒! 这里是超棒的数位$DP$的记搜做法总结 看完仿佛就觉得自己入门了,但是就像 ...
- $Poj3208$ 启示录 数位统计$DP$
Poj AcWing Description Sol 这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i] ...
随机推荐
- [bzoj1051] [HAOI2006]受欢迎的牛 (Tarjan+缩点)
强连通图,缩点 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受 ...
- Visual Studio安装项目中将用户选择的安装路径写入注册表的方法[转]
在你的工程名上右击 -> View ->Registry(视图 -> 注册表) 在你需要写注册表的主键下,例如我注册firefox插件的例子是: (1)右击HKEY_CURRENT_ ...
- (1)若当前字符不是大于0的数字字符,则复制该字符于新字符串中; (2)若当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中; (3)若当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,将它的后继字符重复复制n+1次到新字符串中; (4)以上述一次变换为一组,在不同组之间另插入一个"_"用于分割(5))若字符串中包含有下划线'_',则变换为 \UL
package b; import java.util.Scanner; public class Zifuchuan { public static void main(String[] args) ...
- UPC 2170 D Equal Is Not Really Equal (欧拉路径)
题目链接:http://acm.upc.edu.cn/problem.php?id=2170 题意:给出一个字符串,比如ABACA,在这个串里,AB.BA.AC.CA各出现一次.若存在另外一个串,里面 ...
- [转]Unity 延迟执行一段代码的较为优雅的方式
Unity中,延时执行一段代码或者一个方法或者几个方法的情况非常普遍. 一般会用到Invoke和InvokeRepeating方法.顾名思义,第一个是执行一次,第二个是重复执行. 看下定义: void ...
- 移除virbr0
在我们使用虚拟机管理器的图形界面来安装虚拟机的时候,自动创建虚拟网桥和虚拟网卡.另外,我们很少会在一个虚拟机中再安装一个虚拟机,所以,我们可以将宿主机上的网桥删除.方法如下: # virsh net- ...
- Freebie: Date Picker Calendar Demo Form For Oracle Forms 6i
I have already posted and provided the required PLSQL Library and the Calendar FMX file in my previo ...
- 字符串处理:ABAP中的正则表达式
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 关于Docker 常用命令
Docker 常用命令 分类列一下常用的CLI命令 仓库相关 search/ pull / push / login etc. 例:docker pull ubuntu 从仓库下载ubuntuimag ...
- 再学C++之C++中的全部关键字
/*______C++全部关键字___________*/ asm do if return try auto double inline short typedef bool dynamic_cas ...