杭電ACM 三 洗牌問題

2021-06-28 18:00:24 字數 1019 閱讀 4994

每行乙個整數n

輸出與之對應的m

20

1

20

2

/*

*檔名稱:test.cpp

*作 者:冷基棟

*完成日期:2023年2月13日

*版 本 號:v1.0

*/#include using namespace std;

int main()

else

if(c==1)

break;

m++;

}cout執行結果:

知識點總結:

關於這道題的做法,我這裡複製一下杭電的解題報告:

eddy's洗牌

原始演算法:

我們把每個數逛來逛去最後又回家的過程叫做乙個迴圈,迴圈中經過的位置個數叫做迴圈的長度。如n=4時,有 兩個迴圈:1-2-4-8-7-5-1,長度為6;3-6-3,長度為2。答案就是所有迴圈長度的最小公倍數。顯然演算法時空複雜度均為o(n)(因為需要記錄乙個數是否已被某個迴圈經過)。

高效演算法:

1所在的迴圈長度就是答案。時間複雜度小於o(n),空間複雜度為o(1),程式設計複雜度也遠低於原始演算法。這個演算法是建立在如下結論之上的:「1所在的迴圈長度是其它任一迴圈長度的倍數」,或者表述為「1回家時,其它任一數字也一定回了家」。

給出的證明:

題目中的移動規則,其實就是每次把在第x個位置的數移動到位置x*2 mod (2*n+1)。這個式子是十分巧妙的,請用心領悟。由這個式子可以得出任一數字x在p步之後的位置:x*2^p mod (2*n+1)。假設1經過p步回了家,那麼可得1*2^p mod (2*n+1)=1。由此可得對任一數字x,均有x*2^p mod (2*n+1)=x,即1回家時任一數字都回了家。

學習心得:

好好學習 天天向上



ACM杭電專題三1007

problem description 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於...

杭電acm專題三1011

有乙隻經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請程式設計計算蜜蜂從蜂房a爬到蜂房b的可能路線數。其中,蜂房的結構如下所示。input 輸入資料的第一行是乙個整數n,表示測試例項的個數,然後是n 行資料,每行包含兩個整數a和b 0 output 對於每個測試例項,請輸出蜜蜂從蜂房a爬到蜂房...

杭電OJ 1210 Eddy s 洗牌問題

problem description input 每行乙個整數n output 輸出與之對應的m sample input 20 1 sample output 20 2 author eddy source 杭電acm省賽集訓隊選拔賽之熱身賽 recommend eddy 關於這道題的做法,我這...