Description

Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会。并且她准备给每位来宾准备一些金子作为礼物。为了不伤及每个人的脸面,每个人获得的金子必须相同。Mary将要用一个天平来称量出金子。她有很多的砝码,所有砝码的质量都是4的幂。Mary将金子置于左边并且将砝码置于右盘或者两个盘。她希望每次称量都使用最少的砝码。并且,他希望,每次都用不同的称量方法称出相同质量的金子。对于给定的质量n,Mary希望知道最少需要用多少个砝码可以完成称量,并且想知道用这么多个砝码一共有多少种方式进行称量。

Input

输入文件仅包含一个整数,表示Mary希望给每个人的金子的质量。(1<=n<=10^1000)

Output

输出文件仅包含一个整数,表示一共可能的称量方式对10^9的模。

Sample Input

166

Sample Output

3

HNIT

一共有三种方式称量出166。166=64+64+16+16+4+1+1。166=256-64-16-16+4+1+1。166=256-64-16-4-4-1-1。


首先把n转成4进制,然后开始从低位向高位DP。

f[i]表示不向下一位借位,g[i]表示向下一位借位,f[i],g[i]都要带上两个参数,为当前用了多少个数和匹配种数。转移方程如下:

f[i]=merge(f[i-1]+T[i],g[i-1]+1+T[i]);

g[i]=mergr(f[i-1]+4-T[i],g[i-1]+3-T[i]);

(注:借到的一位不算在当前第i位上,f[i]记录的只是4^i,不论正负)

  1. /*program from Wolfycz*/
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define inf 0x7f7f7f7f
  8. using namespace std;
  9. typedef long long ll;
  10. typedef unsigned int ui;
  11. typedef unsigned long long ull;
  12. inline int read(){
  13. int x=0,f=1;char ch=getchar();
  14. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  15. for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
  16. return x*f;
  17. }
  18. inline void print(int x){
  19. if (x>=10) print(x/10);
  20. putchar(x%10+'0');
  21. }
  22. const int p=1e9;
  23. const int N=1e4;
  24. const int digit=4;
  25. const int base=1e4;
  26. char s[N+10];
  27. struct Bignum{
  28. int v[N+10],len;
  29. Bignum(){len=1,memset(v,0,sizeof(v));}
  30. void read(){
  31. scanf("%s",s);
  32. int t=strlen(s),tim=1;
  33. len=(t-1)/digit+1;
  34. for (int i=0,j=t-1;i<j;i++,j--) swap(s[i],s[j]);
  35. for (int i=0;i<t;i++){
  36. v[i/digit]+=(s[i]-'0')*tim,tim*=10;
  37. if (tim==base) tim=1;
  38. }
  39. }
  40. void write(){
  41. printf("%d",v[len-1]);
  42. for (int i=len-2;~i;i--) printf("%0*d",digit,v[i]);
  43. putchar('\n');
  44. }
  45. }A,Zero;
  46. int operator %(Bignum x,int y){
  47. for (int i=x.len;i;i--) x.v[i-1]+=x.v[i]%y*base;
  48. return x.v[0]%y;
  49. }
  50. Bignum operator /(Bignum &x,int y){
  51. for (int i=x.len;~i;i--) x.v[i-1]+=x.v[i]%y*base,x.v[i]/=y;
  52. while (!x.v[x.len]&&x.len) x.len--;
  53. x.len++;
  54. return x;
  55. }
  56. bool operator ==(const Bignum &x,const Bignum &y){
  57. if (x.len!=y.len) return 0;
  58. for (int i=0;i<=x.len;i++) if (x.v[i]!=y.v[i]) return 0;
  59. return 1;
  60. }
  61. bool operator !=(const Bignum &x,const Bignum &y){return !(x==y);}
  62. struct Dp{
  63. int x,y;
  64. Dp(){}
  65. Dp(int _x,int _y){x=_x,y=_y;}
  66. }f[N+10],g[N+10];
  67. Dp min(const Dp &a,const Dp &b){return a.x<b.x?a:b;}
  68. Dp operator +(const Dp &a,int b){return Dp(a.x+b,a.y);}
  69. Dp operator +(const Dp &a,const Dp &b){return a.x==b.x?Dp(a.x,(a.y+b.y)%p):min(a,b);}
  70. int T[N+10];
  71. int main(){
  72. int tot=1;
  73. A.read();
  74. while (A!=Zero) T[tot++]=A%4,A=A/4;
  75. f[0]=Dp(0,1),g[0]=Dp(inf,0);
  76. for (int i=1;i<=tot;i++){
  77. f[i]=(f[i-1]+T[i])+(g[i-1]+(T[i]+1));
  78. g[i]=(f[i-1]+(4-T[i]))+(g[i-1]+(3-T[i]));
  79. }
  80. printf("%d\n",f[tot].y);
  81. return 0;
  82. }

[POI2007]四进制的天平Wag的更多相关文章

  1. BZOJ 1111: [POI2007]四进制的天平Wag

    1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 223  Solved: 151[Submit][St ...

  2. 1111: [POI2007]四进制的天平Wag

    1111: [POI2007]四进制的天平Wag 链接 题意: 用一些四进制数,相减得到给定的数,四进制数的数量应该尽量少,满足最少的条件下,求方案数. 分析: 这道题拖了好久啊. 参考Claris的 ...

  3. bzoj 1111 [POI2007]四进制的天平Wag 数位Dp

    1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 302  Solved: 201[Submit][St ...

  4. BZOJ1111 : [POI2007]四进制的天平Wag

    POI2007完结撒花~ 首先将n转化为四进制,从低位到高位DP f[i]表示这一位不向下一位借位 g[i]表示这一位向下一位借位,但借的那个不算在i f[0]=0,g[0]=inf f[i]=mer ...

  5. bzoj 1111 - 四进制的天平

    Description 给定 1000的十进制数, 求 最小的 四幂拆分 方案 有多少种 Solution 先大除法 \(n\log_4(n)\)次取余转化为 四进制数. 然后从 低位 往 高位 \( ...

  6. T2963 贪吃蛇【BFS,四进制状压,A*】

    Online Judge:未知 Label:BFS,四进制状压,暴力,A*,哈希,玄学. 题目描述 给定一个n*m的地图和蛇的初始位置,地图中有些位置有石头,蛇不能经过.当然蛇也不能爬到地图之外. 每 ...

  7. .net 获取时间十二进制与二十四进制

    [说明] visual studio工具,.net项目,获取时间 [易错问题] ①二十四小时制(HH小时大写) System.DateTime.Now.ToString("yyyy-MM-d ...

  8. java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制

    package com.rgy.Test; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; ...

  9. 关于不同进制数之间转换的数学推导【Written By KillerLegend】

    关于不同进制数之间转换的数学推导 涉及范围:正整数范围内二进制(Binary),八进制(Octonary),十进制(Decimal),十六进制(hexadecimal)之间的转换 数的进制有多种,比如 ...

随机推荐

  1. 移动端CSS小结

    Meta 标签 <meta name="viewport"  content="width=device-width, user-scalable=no, init ...

  2. 【Mongodb教程 第十一课 】MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  3. HiWorkV1.3版震撼公布,今日起正式公开測试!

    今天HiWork迎来了公开測试和V1.3大版本号更迭,HiWork集成的机器人达到20种,未读消息提醒亦可从不同维度进行设置,不断变好真是件振奋人心的事儿呢. 在这个看重颜值(kan lian)的互联 ...

  4. 2016/2/29 html 思维导图

  5. Python代码分析工具

    Python代码分析工具:PyChecker.Pylint - CSDN博客 https://blog.csdn.net/permike/article/details/51026156

  6. CASE UPDATE

    https://leetcode-cn.com/problems/swap-salary/description/ Given a table salary, such as the one belo ...

  7. (2)mac下安装MySql数据库软件

    一,软件下载: https://dev.mysql.com/downloads/mysql/ 也可以从其他资源下载.不一定非要官方下载 二,安装 这个比较简单,之间双击开启安装程序,一直下一步就可以. ...

  8. SWFObject 的基本使用方法

    SWFObject是一个用于在HTML中方面插入Adobe Flash媒体资源(*.swf文件)的独立.敏捷的JavaScript模块.该模块中的JavaScript脚本能够自动检测PC.Mac机器上 ...

  9. linux下Apache默认安装路径

    如果采用RPM包安装,安装路径应在 /etc/httpd目录下apache配置文件:/etc/httpd/conf/httpd.conf  可以修改相关的访问路径及配置Apache模块路径:/usr/ ...

  10. 二:网络--GET请求和POST请求

    一.GET请求和POST请求简单说明 GET - 从指定的服务器中获取数据 POST - 提交数据给指定的服务器处理 GET方法: 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送 ...