Description

用+-号连接1-n所有数字的数位,问结果是多少.

Sol

数位DP.

\(f[i][j][0/1][0/1]\) 表示长度为 \(i\) 的数字,开头数字是 \(j\) ,是否有前导0(这个会影响符号),每相邻两组数符号是否相同.

转移开一下代码吧.

这道题的符号有点乱,所以转移看起来有些乱...其实只有3个状态,没前导0,有前导0相邻两个数符号相同,有前导0相邻两个数符号不同.

没前导0的只有在第一次统计才会用到.

我发现自己写数位DP就是写小于 \(n\) 的,所有都需要将 \(n+1\) 计算...

一开始自己神tm的取了模...

Code

/**************************************************************
Problem: 1236
User: BeiYu
Language: C++
Result: Accepted
Time:0 ms
Memory:1308 kb
****************************************************************/ #include <cstdio>
#include <iostream>
using namespace std; #define debug(a) cout<<#a<<"="<<a<<" " typedef long long LL;
const int N = 25; LL n;
LL f[N][N][2][2];// i,j 0/1 qiandao0 0/1 fuhao
LL pow10[N]; void init() {
pow10[0]=1;
for(int i=1;i<=18;i++) pow10[i]=pow10[i-1]*10;
for(int j=0;j<10;j++) {
f[1][j][0][0]=f[1][j-1][0][0]+(j&1 ? 1 : -1)*j;
f[1][j][1][0]=f[1][j][0][0];
f[1][j][1][1]=f[1][j-1][1][1]-j;
}
for(int i=2;i<=18;i++) {
f[i][0][0][0]=f[i-1][9][0][0];
f[i][0][1][0]=-f[i-1][9][1][0];
f[i][0][1][1]=-f[i-1][9][1][1];
for(int j=1;j<10;j++) {
f[i][j][0][0]=f[i][j-1][0][0]-f[i-1][9][1][!(i&1)]-(!(i&1))*j*pow10[i-1];
f[i][j][1][0]=f[i][j-1][1][0]-f[i-1][9][1][0];
f[i][j][1][1]=f[i][j-1][1][1]-f[i-1][9][1][1]-j*pow10[i-1];
}
} /* for(int i=1;i<=3;i++) {
for(int j=0;j<10;j++) {
cout<<i<<" "<<j<<":\n";
for(int p=0;p<2;p++) for(int q=0;q<2;q++) debug(f[i][j][p][q]);
cout<<endl;
}
}*/
}
LL calc(LL x) {
LL g=0,r=0,v=0;
for(int i=18;i;i--) {
if(x/pow10[i-1]) {
if(!g) {
r+=f[i][x/pow10[i-1]-1][0][0];
g=i;
}else {
r+=f[i][x/pow10[i-1]-1][1][!(g&1)]*((g-i)&1 ? -1 : 1);
}
if(g&1){
if((x%pow10[i-1])&1) r+=x/pow10[i-1]*((g-i)&1 ? 1 : -1);
}else {
r+=x/pow10[i-1]*(x%pow10[i-1])*((g-i)&1 ? 1 : -1);
}
}x%=pow10[i-1];
}return r;
}
int main() {
init();
cin>>n;
cout<<calc(n+1)<<endl;
// while(cin>>n) cout<<calc(n+1)<<endl;
return 0;
}

BZOJ 1236: SPOJ1433 KPSUM的更多相关文章

  1. 【数位统计】之【spoj1433 KPSUM】

    [spoj1433]KPSUM 来源 高逸涵<数位计数问题解法研究> 由于自己的数位计数类的问题实在太差了,所以把例2用markdown抄写并补充了一遍. 题意 将写在纸上,然后在相邻的数 ...

  2. bzoj 1236: longpo的回文

    1236: longpo的回文 题目描述 一个字符串如果从左到右和从右到左读的结果是一样的,我们称之为回文串.现在给定一个字符串,我们有三种操作: 1.     添加一个字母在任何位置(可以在首尾添加 ...

  3. spoj1433 KPSUM

    题意:略: 首先知道10,20,......100,200,1000的前面的符号都是负号. 举具体例子:221时,计算过程为 000-009,     010-019,   020-029...... ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 【BZOJ】【1269】【AHOI2006】文本编辑器editor

    Splay Splay序列维护的模板题了……为了便于处理边界情况,我们可以先插入两个空格当作最左端和最右端,然后……其实本题主要考察的就是Build.splay和Findkth这三个操作,我们可以实现 ...

  6. 【BZOJ】【2179】FFT快速傅里叶

    FFT 做的第二道用到FFT的……好吧其实还是模板题-_-b 百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=.= /*********************************** ...

  7. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  8. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  9. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

随机推荐

  1. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  2. mysql命令

    create 创建数据库 show databases 显示所有数据库 drop database 删除数据库 use 使用(进入)数据库 select 当前使用的数据库 create table 创 ...

  3. 输入流和字符串互转,InputStream2String,String2InputStream

    输入流转字符串 public static String InputStream2String(InputStream in) { InputStreamReader reader = null; t ...

  4. 格式工厂 v4.0.0 最新去广告绿色纯净版

    最好用的多媒体格式转换利器:格式工厂现已更新至v4.0,此次更新加入最新的HEVC(H265)编码,MP4,MKV的压缩比大幅度提高!格式工厂,轻松转换一切你想要的格式!利器在手,转换不愁! 格式工厂 ...

  5. 将字符串中的URL 解析,获取内容

    parse_str() : parse_str("name=Bill&age=60"); echo $name."<br>";//Bill ...

  6. bzoj1078【SCOI2008】斜堆

    题意: 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大 ...

  7. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  8. Emeditor批量修改文件编码格式(UTF-8)

    采用宏的形式进行,直接在Emeidor导入宏即可使用: emeditor导入宏:[宏]->[自定义]->[新建]->找到EncodingChange.jsee文件即可. 链接:htt ...

  9. install scrapy-redis on centos

    wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmrpm -ivh epel-release- ...

  10. Linux可信计算机制模块详细分析之核心文件分析(8)tpm.c核心代码注释(中)

    /*设置TPM命令格式*/ ssize_t tpm_getcap(struct device *dev, __be32 subcap_id, cap_t *cap, const char *desc) ...