時間限制:
1000
ms | 記憶體限制:
65535
kb難度:
2 描述
小珂遇到了乙個麻煩的問題,有這樣的n對數(1,2),(3,5),(4,7),(6,10)……,第i對的差值為i,第n對數的第乙個數為沒在前n-1對中出現過的數中最小的,現在要找第n對這樣的數,你能幫幫他嗎?
輸入第一行只有乙個整數m(m<=10000),表示測試資料組數。
接下來的m行,每行有乙個整數n(n<=100000)。
輸出輸出第n對數,每組輸出佔一行。
樣例輸入
213
樣例輸出
1 24 7
這種博弈比前面一種要稍微複雜一點。我們來看下下面這個遊戲。
有兩堆火柴棍,每次可以從某一堆取至少1根火柴棍(無上限),或者從兩堆取相同的火柴棍數。最後取完的是勝利者。好了,如果你不知道這個博弈定理,對於小數目的火柴棍數,可能還能推出來,但是如果火柴棍數一多,就不行了。看了下面的這個介紹,你也會有一種被騙的感覺。
首先我們知道兩堆火柴是沒有差別的,也就是說第一堆有a根,第二堆有b根和第一堆有b根,第二堆有a根是一樣的結果。
我們用乙個二維的狀態(a,b)來記錄當前剩下的火柴數,表示第一堆剩下a根火柴,第二堆剩下b根火柴。同樣我們假設兩個人的編號是a和b,且a先取。
那麼如果某個人遇到了這樣的狀態(0,0)那麼也就是說這個人輸了。這樣的狀態我們叫做奇異狀態,也可以叫做失敗態。
那麼接下來的幾個失敗態為(1,2),(3,5),(4,7),(6,10),(8,13)……
我們用a[i]表示失敗態中的第乙個,b[i]表示失敗態中的第二個.(i從0開始).
那麼我們可以看到b[i] = a[i]+i;(i >= 0),a[i]是前面的失敗態中沒有出現過的最小的整數
下面我們可以得到三個基本的結論。
1.每個數僅包含在乙個失敗態中
首先我們知道a[k]是不可能和前面的失敗態中的a[i],b[i]重複的(這點由a[i]的得到可以知道)
b[k] = a[k]+k > a[k-1]+k>a[k-1]+k-1+1>a[k-1]+(k-1) = b[k-1]>a[k-1]這樣我們知道每個數僅在乙個失敗態中。
2.每個失敗態可以轉到非失敗態。
加入當前的失敗態為(a,b),那麼如果我們只在一堆中取的話,肯定會變成非失敗態(這點由第一點可以保證),如果從兩堆同時取的話,由於每個失敗態的差是不一樣的,所以也不可能得到乙個失敗態。也就是說乙個失敗態不管你怎麼取,都會得到乙個非失敗態。
3.每個非失敗態都可以轉到乙個失敗態
對於這個結論,首先我們要知到每個狀態(a,b)要麼a = a[i],要麼b = b[i].(每個數都出現在乙個失敗態中),下面我們分兩種情況來討論
i.a = a[i].如果b = a的話那麼一次取完就變成了(0,0).如果b > b[i]的話,那麼我們從第二堆中取走b-b[i]就變成了乙個失敗態。如果b < b[i].那麼我們從兩堆中同時取走a-a[b-a[i]]這樣得到失敗態(a[b-a[i]],a[b-a[i]]+b-a[i])(a[i] = a)
ii.b = b[i].如果a > a[i]那麼我們從第一堆中取走a-a[i]根火柴.
如果a < a[i].這裡又分兩種情況。第一是a = a[k](k < i)
那麼我們從第二堆取走b - b[k]就行了。
第二是a = b[k]這樣的話由於兩堆火柴是沒有區別的,所以我們把b變成a[k]就行了,也即是從第二堆火柴中取走b - a[k]就變成了失敗態
至於怎麼判斷乙個狀態是否是失敗態.我們可以用下面的方法來判斷
a[i] = [i*(1+√5)/2](這裡的中括號表示向下取整) b[i] = a[i]+i;
那麼這就是乙個失敗態,
#include#includeint main()
return 0;
}
來看最優程式:
#include#define n 170001
#define m 100001
bool a[n];
int b[m];
int main()
scanf("%d",&n);
while(n--)
return 0;
}
453 小珂的煩惱 打表吧
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 小珂遇到了乙個麻煩的問題,有這樣的n對數 1,2 3,5 4,7 6,10 第i對的差值為i,第n對數的第乙個數為沒在前n 1對中出現過的數中最小的,現在要找第n對這樣的數,你能幫幫他嗎?輸入第一行只有乙個整數m m 10000...
nyoj144 小珂的苦惱
時間限制 1000 ms 記憶體限制 10000 kb 難度 2描述 小珂是一名初中生,她現在很苦惱,因為老師布置了乙個讓她苦惱的作業,你能不能幫助她呢?題目資訊如下。已知二元一次方程 a x b y n,判斷這個二元一次方程有沒有整數解,x,y為未知數,其中a,b,n都為整數且不等於零,同時滿足0...
小珂的遊戲
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 假設有2k個人圍著乙個圓桌坐著,前k個是好人,後k個是壞人 現在開始,每m個人踢掉乙個,比如有6個人,m 5,那麼,被踢掉的人依次是5,4,6,2,3,1。現在要求,在踢掉第乙個好人前,必需把所有的壞人踢掉,問,給定乙個k,求滿...