【redundant binary - 冗余二进制】:由0,1,2构成的二进制形式,基数还是2。

现给你一十进制数n,问其可转化成多少种冗余二进制形式。

首先要想到:2x = 2*2x-1 也就是说 10 <=> 02;20 <=> 12

10000

-> 10000

-> 02000

-> 01200

-> 01120

-> 01112

从上面可以看出,第一位的1保持不变时,有1种冗余二进制形式;第一位的1变为0时,其后有多少个0存在,就有多少种冗余二进制形式;

从低位向高位看,每到一个1进行计算,记a为该位的1保持不变的方案数,b为该位的1变成0存在的方案数。记录该位1与上一位1之间连续0的个数。初始有a[0]=1,b[0]=0,c=0。

则(从低位向高位)第i个1保持不变的方案数a[i] =  上一位的1保持不变的方案数a[i-1] + 上一位的1变为0的方案数b[i-1];

(从低位向高位)第i个1变为0的方案数b[i] =  上一位的1保持不变的方案数a[i-1]*c + 上一位的1变为0的方案数b[i-1]*(c+1);

(注意此处的c+1,因为上一位1变成0后,该位1与上一个非零位之间会多出一个0来,即c+1个0;

举例说明:10100001

step1: 右边第1位为1,此时c=0;  a[1] =  a[0] + b[0] = 1;

                (1010000)

                b[1] =  a[0]*0 + b[0]*1 = 0;

step2: 右边第6位为1,此时c=4;  a[2] =  a[1] + b[1] = 1;

                (10100001)-> a[1]

                b[2] =  a[1]*4 + b[2]*5 = 4;

                (100001)-> a[1]*4

                (10001)

                (1001)

                (101)

step3: 右边第8位为1,此时c=1;  a[3] =  a[2] + b[2] = 5;

                (000001) -> a[2]

                (020001) -> b[2]

                (012001)

                (011201)

                (011121)

                b[3] =  a[2]*1 + b[2]*2 = 9;

                (2100001) -> a[2]*1

                (020001)   -> b[2]*2

                (20001)

                (012001)

                (12001)

                (011201)

                (11201)

                (011121)

                (11121)

最后的答案就是a[n]+b[n]。

附代码:

 import java.math.BigInteger;
import java.util.Scanner; public class Main { public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in); while(cin.hasNext())
{
BigInteger n = cin.nextBigInteger();
if (n.signum() < 0) break;
BigInteger a = BigInteger.ONE, b = BigInteger.ZERO;
int c = 0;
for(int i = 0; i < n.bitLength(); i++)
{
if(n.testBit(i))
{
BigInteger a_ = a.add(b);
BigInteger b_ = a.multiply(BigInteger.valueOf(c)).add(b.multiply(BigInteger.valueOf(c+1)));
c = 0;
a = a_;
b = b_;
}
else
c++;
}
System.out.println(a.add(b));
}
cin.close();
}
}

【思路,dp,BigInteger】ZOJ - 2598 Yet Another Digit的更多相关文章

  1. 成环的概率dp(初级) zoj 3329

    原题地址:https://vjudge.net/problem/ZOJ-3329 题目大意: 有三个骰子,分别有k1,k2,k3个面,初始分数是0.第i骰子上的分数从1道ki.当掷三个骰子的点数分别为 ...

  2. HDU 4791 Alice's Print Service 思路,dp 难度:2

    A - Alice's Print Service Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  3. 树dp...吧 ZOJ 3949

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5568 Edge to the Root Time Limit: 1 Secon ...

  4. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  5. AGC033 D~F——[ 值放到角标的DP ][ 思路+DP ][ 思路 ]

    地址:https://atcoder.jp/contests/agc033/ D Complexity dp[ i ][ j ][ k ][ l ] 表示左上角是 ( i , j ) .右下角是 ( ...

  6. BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)

    题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...

  7. CF 809 D Hitchhiking in the Baltic States —— 思路+DP(LIS)+splay优化

    题目:http://codeforces.com/contest/809/problem/D 看题解,抄标程...发现自己连 splay 都快不会写了... 首先,题目就是要得到一个 LIS: 但与一 ...

  8. zoj 3380 Patchouli's Spell Cards 概率DP

    题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...

  9. 概率DP

    POJ 3744 Scout YYF I 这就是一个乱搞题,暴力发现TLE了,然后看了看discuss里说可以矩阵加速,想了一会才想明白怎么用矩阵,分着算的啊.先算f[num[i]-1]之类的,代码太 ...

随机推荐

  1. OC:Block语法、Block使用、Block实现数组排序

    Block //定义一个求两个数最大值函数 int maxValue (int ,int); //函数的实现 int maxValue (int a, int b){ return  a > b ...

  2. urlrewritingnet 域名http状态302 问题(转)

    UrlRewritingNet is an Url rewriting tool for ASP .Net and Elmahis a module for logging unhandled err ...

  3. 全代码实现ios-3

    决定做ios开发的时候,看了很多本关于ios开发的书籍,其中有国内的人写的,也有根据外国的书翻译过来的. 很可惜,这些书里的例子没办法照搬过来,因为Xcode更新换代太快了,而这些书本的内容更新的速度 ...

  4. 使用#pragma阻止一些warnings

    这篇博客的内容都是记的网上的.是流水账.只是记录下来以便日后之有,避免每次重新google. #pragma除了可以用来把不同功能的代码进行分隔组织外还可以用来disable一些warnings.这在 ...

  5. jquery调用页面的方法

    本文转载:http://www.cnblogs.com/chenxizhang/archive/2009/05/28/1491250.html 有些朋友问到,能不能在jquery代码中调用后台cs页面 ...

  6. JDK - Tomcat - Eclipse - JSP - Servlet 配置运行全攻略

    花了将近两个月的时间,从 JDK 开始一步一步摸索,历经千辛万苦,终于让第一个 Servlet 运行起来了,创建第一个 Servlet  程序确实要比创建第一个 Asp.net 程序困难多了,但是不要 ...

  7. Slony-I的删除:

    接前篇:http://www.cnblogs.com/gaojian/p/3196244.html 简单的Slony-I设置实例 如何删除slony相关的内容呢. 我再另外找一台机器,安装slony, ...

  8. C++学习笔记之数据类型

    一.变量名 几条简单的C++命名规则: 在名称中只能使用字母,数字和下划线 名称的第一个字符不能是数字 区分大小写 不能将C++关键字用作名称 以两个下划线和大写字母打头的名称被保留给实现(编译器及其 ...

  9. GLSL实现Image Filter 【转】

    http://blog.csdn.net/a3070173/archive/2008/11/27/3390477.aspx 图像过滤无论是在作图工具还是特效的实现上都时有运用,这里发一些通常会使用到的 ...

  10. 移动端折腾国外分享(facebook、twitter、linkedin)

    一.前言 国内做HTML5页面,关注最多就是微信分享了,之前也写过关于微信分享的文章,可以点击查看:分享相关文章 再者,就是国内的其它分享,比如常用的新浪微博.腾讯微博.QQ空间等等,最方便的就是直接 ...