POI2007 四進製的天平Wag

2022-05-31 19:21:12 字數 1874 閱讀 1336

description

mary準備舉辦乙個聚會,她準備邀請很多的人參加她的聚會。並且她準備給每位來賓準備一些金子作為禮物。為了不傷及每個人的臉面,每個人獲得的金子必須相同。mary將要用乙個天平來稱量出金子。她有很多的砝碼,所有砝碼的質量都是4的冪。mary將金子置於左邊並且將砝碼置於右盤或者兩個盤。她希望每次稱量都使用最少的砝碼。並且,他希望,每次都用不同的稱量方法稱出相同質量的金子。對於給定的質量n,mary希望知道最少需要用多少個砝碼可以完成稱量,並且想知道用這麼多個砝碼一共有多少種方式進行稱量。

input

輸入檔案僅包含乙個整數,表示mary希望給每個人的金子的質量。(1<=n<=10^1000)

output

輸出檔案僅包含乙個整數,表示一共可能的稱量方式對10^9的模。

sample input

166sample output

3hnit

一共有三種方式稱量出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,不論正負)

/*program from wolfycz*/

#include#include#include#include#include#define inf 0x7f7f7f7f

using namespace std;

typedef long long ll;

typedef unsigned int ui;

typedef unsigned long long ull;

inline int read()

inline void print(int x)

const int p=1e9;

const int n=1e4;

const int digit=4;

const int base=1e4;

char s[n+10];

struct bignum

void read()

} void write()

}a,zero;

int operator %(bignum x,int y)

bignum operator /(bignum &x,int y)

bool operator ==(const bignum &x,const bignum &y)

bool operator !=(const bignum &x,const bignum &y)

struct dp

dp(int _x,int _y)

}f[n+10],g[n+10];

dp min(const dp &a,const dp &b)

dp operator +(const dp &a,int b)

dp operator +(const dp &a,const dp &b)

int t[n+10];

int main()

printf("%d\n",f[tot].y);

return 0;

}

POI 2007 旅遊景點

題目鏈結 演算法 首先,用dijkstra演算法求出2 k 1到每個點的最短路 然後,我們用f s i 表示目前停留城市集合為s,現在在城市i,最短的路徑 狀壓dp即可 includeusing namespace std define maxn 20010 define maxm 200010 d...

POI2007 駕駛考試egz

description 成都的駕駛考試在乙個有n條平行的自南向北的單向的道路的場地中進行。每條道路長度為m公尺,並且都在同一條水平線上開始和結束。街道從西向東分別編號為1到n。同樣有p條單向的自西向東或自東向西的街道垂直於上面描述的街道,每一條這樣的街道鏈結了兩個相鄰的自南向北的道路。當然自西向東和...

POI2007 山峰和山谷Grz

description fgd小朋友特別喜歡爬山,在爬山的時候他就在研究山峰和山谷。為了能夠讓他對他的旅程有乙個安排,他想知道山峰和山谷的數量。給定乙個地圖,為fgd想要旅行的區域,地圖被分為 n times n 的網格,每個格仔 i,j 的高度w i,j 是給定的。若兩個格仔有公共頂點,那麼他們就...