BZOJ 1111: [POI2007]四进制的天平Wag
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
Sample Output
样例解释
一共有三种方式称量出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
分析
讲真,这题动态规划的思路不难,上了趟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数组,有如下转移——
F[i][0] <- F[i - 1][0] + num[i]
F[i][0] <- F[i - 1][1] + 4 - num[i]
F[i][1] <- F[i - 1][0] + num[i] - 1
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的更多相关文章
- bzoj 1111 [POI2007]四进制的天平Wag 数位Dp
1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 302 Solved: 201[Submit][St ...
- 1111: [POI2007]四进制的天平Wag
1111: [POI2007]四进制的天平Wag 链接 题意: 用一些四进制数,相减得到给定的数,四进制数的数量应该尽量少,满足最少的条件下,求方案数. 分析: 这道题拖了好久啊. 参考Claris的 ...
- BZOJ1111 : [POI2007]四进制的天平Wag
POI2007完结撒花~ 首先将n转化为四进制,从低位到高位DP f[i]表示这一位不向下一位借位 g[i]表示这一位向下一位借位,但借的那个不算在i f[0]=0,g[0]=inf f[i]=mer ...
- [POI2007]四进制的天平Wag
Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...
- bzoj 1111 - 四进制的天平
Description 给定 1000的十进制数, 求 最小的 四幂拆分 方案 有多少种 Solution 先大除法 \(n\log_4(n)\)次取余转化为 四进制数. 然后从 低位 往 高位 \( ...
- T2963 贪吃蛇【BFS,四进制状压,A*】
Online Judge:未知 Label:BFS,四进制状压,暴力,A*,哈希,玄学. 题目描述 给定一个n*m的地图和蛇的初始位置,地图中有些位置有石头,蛇不能经过.当然蛇也不能爬到地图之外. 每 ...
- .net 获取时间十二进制与二十四进制
[说明] visual studio工具,.net项目,获取时间 [易错问题] ①二十四小时制(HH小时大写) System.DateTime.Now.ToString("yyyy-MM-d ...
- java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制
package com.rgy.Test; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; ...
- Java【第二篇】基本语法之--进制、运算符
进制 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头. 十进制:0-9 ,满 10 进 1. 八进制:0-7 ,满 8 进1. 以数字 0 开头表示. 十六进制 ...
随机推荐
- 你所未知的3种 Node.js 代码优化方式
from:https://cnodejs.org/topic/56cc2fd6c045c3743304bec6 Node.js 程序的运行可能会受 CPU 或输入输出操作的限制而十分缓慢.从 CPU ...
- apt-get update更新源时,出现“Hash Sum mismatch”问题
当使用apt-get update更新源时,出现下面"Hash Sum mismatch"的报错,具体如下:root@localhost:~# apt-get update.... ...
- P3369 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...
- Windows 8.1 新增控件之 CommandBar
上一篇为大家介绍了AppBar 的相关内容,本篇继续介绍CommandBar 的使用方法.与AppBar 相比而言,CommandBar 在开发使用方面较为单一,在按键布局上分为主控区(Primary ...
- C#计算文件的MD5值实例
C#计算文件的MD5值实例 MD5 是 Message Digest Algorithm 5(信息摘要算法)的缩写,MD5 一种散列(Hash)技术,广泛用于加密.解密.数据签名和数据完整性校验等方面 ...
- Android性能优化之Systrace工具介绍(一) _&& Systrace生成的trace.html打开空白或者打不开的解决办法
1.必须用Chrome打开 2.在mac电脑上,可能Chrome打开也是空白,解决办法是:在chrome地址栏中输入”chrome:tracing”,然后点击load按钮load你的trace.htm ...
- 常用 redis 命令(for php)
Redis 主要能存储 5 种数据结构,分别是 strings,hashes,lists,sets 以及 sorted sets. 新建一个 redis 数据库 $redis = new Redis( ...
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- [codeforces 519E]E. A and B and Lecture Rooms(树上倍增)
题目:http://codeforces.com/problemset/problem/519/E 题意:给你一个n个点的树,有m个询问(x,y),对于每个询问回答树上有多少个点和x,y点的距离相等 ...
- [BZOJ2876][NOI2012]骑行川藏(拉格朗日乘数法)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2876 分析:就是要求约束条件下函数的极值,于是拉格朗日乘数列方程,发现化简后的关于vi ...