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

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 223  Solved: 151
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

166

Sample Output

3
样例解释
一共有三种方式称量出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。

HINT

 

Source

 

[Submit][Status][Discuss]

分析

讲真,这题动态规划的思路不难,上了趟WC就有了,但是废了好大劲才把这个巨型整数变成4进制,当然中间是“天马行空”就是了。

假如已经有了这个整数的四进制表示方法,如166的四进制数2212,称第1个2为第1位,第2个2为第2位,而1为第3位。

动态规划如下:

F[i][0]表示第i位上目前就是第i位数字的最小操作数。

F[i][1]表示第i位上目前是第i位数字+1的最小操作数。

G[i][0]和G[i][1]分别对应两者的方案数。

对于F数组,有如下转移——

  1. F[i][0] <- F[i - 1][0] + num[i]

  2. F[i][0] <- F[i - 1][1] + 4 - num[i]

  3. F[i][1] <- F[i - 1][0] + num[i] - 1

  4. F[i][1] <- F[i - 1][1] + 3 - num[i]

显然就是枚举达到当前转态要求的数字,可以用什么方式得到。要么是从0加到num[i],要么是从4减到num[i]。

代码

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std; #define lim 100000 int stk[lim]; class BigNum
{
private:
int s[lim]; char gc(void)
{
return getchar();
} void pc(char c = '\n')
{
putchar(c);
} int gl(void)
{
int len = lim; while (!s[--len] && len); len = len == ? : len; return len;
} public:
BigNum(void)
{
memset(s, , sizeof(s));
} void read(void)
{
int tot = , len = ; for (char c = gc(); c >= ''; c = gc())
stk[++tot] = c - ''; while (tot)s[++len] = stk[tot--];
} void print(void)
{
for (int len = gl(); len; )
pc(s[len--] + '');
} void println(void)
{
print(); pc();
} int mod4(void)
{
int res = ; for (int len = gl(); len; )
res = (res* + s[len--]) & ; return res;
} void div4(void)
{
for (int len = gl(); len; --len)
s[len - ] += (s[len] & )*, s[len] >>= ; s[] = ;
} bool not0(void)
{
if (gl() > || s[])
return true;
return false;
}
}num; const int MOD = 1e9; int f[lim][];
int g[lim][]; void Min(int &a, int b)
{
a = min(a, b);
} void add(int &a, int b)
{
a += b; if (a >= MOD)
a -= MOD;
} signed main(void)
{
num.read(); int tot = ; while (num.not0())
stk[++tot] = num.mod4(), num.div4(); reverse(stk + , stk + + tot); memset(g, , sizeof(g));
memset(f, 0x3f3f3f3f, sizeof(f)); f[][] = ; g[][] = ;
f[][] = ; g[][] = ; for (int i = ; i <= tot; ++i)
{
Min(f[i][], f[i - ][] + stk[i]);
Min(f[i][], f[i - ][] + - stk[i]);
Min(f[i][], f[i - ][] + stk[i] + );
Min(f[i][], f[i - ][] + - stk[i]);
} for (int i = ; i <= tot; ++i)
{
if (f[i][] == f[i - ][] + stk[i])
add(g[i][], g[i - ][]);
if (f[i][] == f[i - ][] + - stk[i])
add(g[i][], g[i - ][]);
if (f[i][] == f[i - ][] + stk[i] + )
add(g[i][], g[i - ][]);
if (f[i][] == f[i - ][] + - stk[i])
add(g[i][], g[i - ][]);
} printf("%d\n", g[tot][]);
}

BZOJ_1111.cpp

@Author: YouSiki

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

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

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

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

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

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

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

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

    Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...

  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. Java【第二篇】基本语法之--进制、运算符

    进制 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头. 十进制:0-9 ,满 10 进 1. 八进制:0-7 ,满 8 进1. 以数字 0 开头表示. 十六进制 ...

随机推荐

  1. http协议(一)基础知识

    我自己写的随笔一般是偏学习笔记性质的,或者一点个人理解,适合新人,大牛可以忽略这个...... 参考书籍——<图解http> 当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就 ...

  2. 关于MyBatis mapper的insert, update, delete返回值

    这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...

  3. 2178 表达式运算Cuties

    2178 表达式运算Cuties  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 大师 Master 题解       题目描述 Description 给出一个表达式,其中运算 ...

  4. 使用gogs,drone搭建自动部署

    使用gogs,drone搭建自动部署 使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台Docker是使用go开发的开源容器引擎D ...

  5. nginx架构

    nginx平台初探(100%)  

  6. Ros与Vrep平台搭建

    参考资料: ROS安装: ros 是一个framework 和Android有点像,内核用的linux.Ros提供了一种供机器人开发者迅速上手的一个平台, 可以快速搭建自己的应用,利用ros下面自带的 ...

  7. Ice的HelloWorld(Java)

    Ice是一种面向对象的中间间平台,入门ice,简单的HelloWorld是必不可少的. 转载请注明http://www.cnblogs.com/zrtqsk/p/3745286.html,谢谢. 一. ...

  8. Spring Security笔记:自定义登录页

    以下内容参考了 http://www.mkyong.com/spring-security/spring-security-form-login-example/ 接上回,在前面的Hello Worl ...

  9. Android -- Adapter

    体系 public interface Adapter----0层(表示继承体系中的层次)  public interface ExpandableListAdapter---(无所谓层次因为没有其他 ...

  10. 数据字典生成工具之旅(8):SQL查询表的约束默认值等信息

    上一篇代码生成工具里面已经用到了读取表结构的SQL,这篇将更加详细的介绍SQL SERVER常用的几张系统表和视图! 阅读目录 系统表视图介绍 实际应用 本章总结 工具源代码下载 学习使用 回到顶部 ...