【思路,dp,BigInteger】ZOJ - 2598 Yet Another Digit
【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的更多相关文章
- 成环的概率dp(初级) zoj 3329
原题地址:https://vjudge.net/problem/ZOJ-3329 题目大意: 有三个骰子,分别有k1,k2,k3个面,初始分数是0.第i骰子上的分数从1道ki.当掷三个骰子的点数分别为 ...
- HDU 4791 Alice's Print Service 思路,dp 难度:2
A - Alice's Print Service Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- 树dp...吧 ZOJ 3949
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5568 Edge to the Root Time Limit: 1 Secon ...
- LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推
题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...
- AGC033 D~F——[ 值放到角标的DP ][ 思路+DP ][ 思路 ]
地址:https://atcoder.jp/contests/agc033/ D Complexity dp[ i ][ j ][ k ][ l ] 表示左上角是 ( i , j ) .右下角是 ( ...
- BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)
题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...
- CF 809 D Hitchhiking in the Baltic States —— 思路+DP(LIS)+splay优化
题目:http://codeforces.com/contest/809/problem/D 看题解,抄标程...发现自己连 splay 都快不会写了... 首先,题目就是要得到一个 LIS: 但与一 ...
- zoj 3380 Patchouli's Spell Cards 概率DP
题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...
- 概率DP
POJ 3744 Scout YYF I 这就是一个乱搞题,暴力发现TLE了,然后看了看discuss里说可以矩阵加速,想了一会才想明白怎么用矩阵,分着算的啊.先算f[num[i]-1]之类的,代码太 ...
随机推荐
- cf754 A. Lesha and array splitting
应该是做麻烦了,一开始还没A(幸好上一次比赛水惨了) #include<bits/stdc++.h> #define lowbit(x) x&(-x) #define LL lon ...
- poj3468A Simple Problem with Integers(线段树,在段更新时要注意)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- erlang自定义数据类型
Erlang系统自带的基础数据类型有:atom.tuple.list.binary.pid.float.number.port.reference.record. 用户可以通过通过命令type来自定义 ...
- 转载:DIV+CSS有可能遇到的问题
[总结]DIV+CSS有可能遇到的问题 一.超链接访问过后hover样式就不出现的问题? 被点击访问过的超链接样式不在具有hover和active了,解决方法是改变CSS属性的排列顺序: L-V-H- ...
- javascript数字转汉字中文数字
/* 工具包 */ var Utils={ /* 单位 */ units:'个十百千万@#%亿^&~', /* 字符 */ chars:'零一二三四五六七八九', /* 数字转中文 @numb ...
- 解决Unable to connect to a repository at URL 禁止访问 (forbidden)
连接SVN报如下错误. Unable to connect to a repository at URL 禁止访问 (forbidden) 1. 右键点击本地副本,TortoiseSV ...
- List排序忽略大小写
public List<String> sortListIgnoreCase(List<String> list) { Collections.sort(list ...
- 你已经毁了JavaScript
以前 过去我们在页面上用很时尚的方式写了一些确实很可怕的代码,它给我们带来了巨大的麻烦.可能很多人现在还在这样做,但他们不会看这篇博文,我们可以假装他们不存在. JS的伟大/了不起/让人惊讶的地方在于 ...
- hdu 4493 Tutor 水题
Tutor Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4493 D ...
- UESTC 890 Card Trick(DP 纸牌魔术)
题意 给你一些牌 所有正面朝下放桌子上 你选一个起点 翻开那张牌 牌上的数字是几就向前走几步 J,Q,K 都是向前走10步 A向前走11步 知道向前走相应的步数后超过了终点 ...