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 是給定的。若兩個格仔有公共頂點,那麼他們就...