【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】的更多相关文章

  1. Codeforces 55D Beautiful Number (数位统计)

    把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容:  a positive integer number is beautiful if and only if it is  ...

  2. [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 ...

  3. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  4. BZOJ 1236: SPOJ1433 KPSUM

    Description 用+-号连接1-n所有数字的数位,问结果是多少. Sol 数位DP. \(f[i][j][0/1][0/1]\) 表示长度为 \(i\) 的数字,开头数字是 \(j\) ,是否 ...

  5. 数位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 ...

  6. 0x5C 数位统计DP

    怎么说,数位DP还是我的噩梦啊,细节太恐怖了. 但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少) poj3208 f[i] ...

  7. 紫书 例题 10-22 UVa 1640(数位统计)

    这道题的题解有几个亮点 一个是每次只统计一个数字来简化思维 一个是统计当前位数的时候分三个部分来更新答案 具体看代码,有注释 #include<cstdio> #include<cs ...

  8. $BZOJ1799\ Luogu4127$ 月之谜 数位统计$DP$

    AcWing Description Sol 看了很久也没有完全理解直接$DP$的做法,然后发现了记搜的做法,觉得好棒! 这里是超棒的数位$DP$的记搜做法总结   看完仿佛就觉得自己入门了,但是就像 ...

  9. $Poj3208$ 启示录 数位统计$DP$

    Poj  AcWing Description Sol  这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i] ...

随机推荐

  1. dg_MeetingRoom 居中显示

    标题栏 居中 DataGridViewCellStyle headerStyle = new DataGridViewCellStyle(); //dg_MeetingRoom 头居中样式 heade ...

  2. ContentProvider官方教程(5)ContentResolver插入、更新、删除 示例

    Inserting, Updating, and Deleting Data In the same way that you retrieve data from a provider, you a ...

  3. centos7 安装 mariadb 的正确命令

    使用的是linode的centos7系统,安装mysql发现已经默认的是mariadb. 但是不管是使用linode官网说明还是百度搜索到的的根本安装方法无法安装成功. 总是提示这一句: ERROR  ...

  4. BZOJ 3532: [Sdoi2014]Lis (最大流)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3532 题意:给出三个数列ABC,长度均为n.删除A中的某些数字,使得A的最长上升子 ...

  5. Eclipse / android studio 添加第三方jar包 步骤

    eclipse 将第三方包放到libs文件夹后并没有引用. 基本步骤分为3步,具体介绍如下: 打开自己的Eclipse,在自己的Android工程上名上右键->Build Path ->C ...

  6. 对 strcpy_s 若干测试

    今天发现如果strcpy这函数,目标buffer太小,会有意想不到的崩溃.而且不容易调试.以后尽量要用strcpy_s了. strcpy_s是strcpy的更安全的版本 1.当目标字符串参数是一个字符 ...

  7. Dev gridview新增一行自动获得焦点并打开编辑模式

    1.gridview添加一行自动获得焦点实现方式: 关键代码: GarsonZhang dt.Rows.Add("1", "2"); gridView1.Foc ...

  8. VIM如何将全部内容复制并粘贴到外部

    ubuntu默认安装的vim是不支持系统剪切.粘贴版的,需要执行以下安装:sudo apt-get install vim-gnome 注意要让vim支持系统粘贴板,首先执行sudo apt-get ...

  9. 通过NuGet获取sqlite对应的.net的dll

    https://www.nuget.org/packages/System.Data.SQLite/ 直接在Package Manager Console中执行命令,会自动安装依赖项的 Install ...

  10. [C程序设计语言]第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...