杭電OJ 1210 Eddy s 洗牌問題

2021-12-29 22:38:52 字數 1154 閱讀 4592

eddy's 洗牌問題  

problem description

eddy是個acmer,他不僅喜歡做acm題,而且對於紙牌也有一定的研究,他在無聊時研究發現,如果他有2n張牌,編號為1,2,3..n,n+1,..2n。這也是最初的牌的順序。通過一次洗牌可以把牌的序列變為n+1,1,n+2,2,n+3,3,n+4,4..2n,n。那麼可以證明,對於任意自然數n,都可以在經過m次洗牌後第一次重新得到初始的順序。程式設計對於小於100000的自然數n,求出m的值。  

input

每行乙個整數n  

output

輸出與之對應的m  

sample input201

sample output202

author

eddy  

source

杭電acm省賽集訓隊選拔賽之熱身賽  

recommend

eddy

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

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回家時任一數字都回了家。 

發**:

[cpp] 

#include  

using namespace std;  

int main()  

cout<

}  return 0;  

}   

杭電OJ 1210 Eddy s 洗牌問題

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

HDOJ 1210 Eddy s 洗牌問題

上來大家的第一反應都是去找規律,想著去找通解,但是如果打表的話會發現並沒有什麼特別明確的通解,所以方向都錯了,其實這道題對書寫方式也是乙個誤導,我們看著n 1,1,n 2,2 2n,n,這組資料心裡面想的往往都是把前面n個數插入到後面n個數裡面,這樣想當然沒問題,但是就看不出這其實是一種置換,其實我...

飯卡 杭電oj

解題思路就是沒有5元的直接輸出 大於5元的要用5元貪心價值最大的 減去5元後的錢要最優即動態規劃中的01揹包 include include include using namespace std int c 1005 1005 int max int a,int b int main m1 m m...