描述
小hi和小ho的班級正在進行班長的選舉,他們決定通過一種特殊的方式來選擇班長。
首先n個候選人圍成乙個圈,依次編號為0..n-1。然後隨機抽選乙個數k,並0號候選人開始按從1到k的順序依次報數,n-1號候選人報數之後,又再次從0開始。當有人報到k時,這個人被淘汰,從圈裡出去。下乙個人從1開始重新報數。
也就是說每報k個數字,都會淘汰一人。這樣經過n-1輪報數之後,圈內就只剩下1個人了,這個人就作為新的班長。
舉個例子,假如有5個候選人,k=3:
初始對於n=5,k=3的情況,最後當選班長的人是編號為3的候選人。0: 0 1 2 3 4
從0號開始報數,第1次是2號報到3
1: 0 1 - 3 4 // 0 1 2, 2號候選人淘汰
從3號開始報數,第2次是0號報到3
2: - 1 3 4 // 3 4 0, 0號候選人淘汰
從1號開始報數,第3次是4號報到3
3: 1 3 - // 1 3 4, 4號候選人淘汰
從1號開始報數,第4次是1號報到3
4: - 3 // 1 3 1, 1號候選人淘汰
小ho:小hi,我覺得當人數和k都確定的時候已經可以確定結果了。
小hi:嗯,沒錯。
小ho:我也想當班長,小hi你能提前告訴我應該站在哪個位置麼?
小hi:我可以告訴你怎麼去求最後乙個被淘汰的位置,不過具體的值你得自己去求解。
小ho:嗯,沒問題,那麼你快告訴我方法吧!
輸入第1行:1個正整數t,表示多組輸入資料,1≤t≤100
第2..t+1行:每行2個正整數n,k,第i+1行表示第i組測試資料,2≤n≤1,000,000,000。2≤k≤1,000
輸出第1..t行:每行1個整數,第i行表示第i組資料的解
樣例輸入
2樣例輸出5 38 3
36思路
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11using
namespace
std;
12int yue(int n,int
k)16 ret=yue(n-n/k,k);
17if(ret<(n%k))ret=ret-n%k+n;
18else ret=ret-n%k+(ret-(n%k))/(k-1
);19
return
ret;20}
21int main()
28return0;
29 }
約瑟夫環問題(數論)
約瑟夫環問題描述 n 個人圍成一圈 編號分別為1 n 從某人開始順序報號1,2,3 m凡報到m者的人出列,再接著從下乙個人開始數,輸出最終出列的人的編號。約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個...
UVa 1363 約瑟夫的數論問題
題目 題目鏈結 題意 給定n,k,求出 ni 1 k modi 分析 這題不難,但是我一直wa了七次,我的思路跟書上的是一樣的,一直找錯誤,一直wa,但一直找不到我 錯了,後來無奈,看了劉汝佳的 他實現起來沒有討論k和n誰小誰大,直接比較的,而我先討論了,n k的情況 因為這時候,對於所有的i k,...
UVA 1363 約瑟夫的數論問題
輸入正整數n和k 1 n,k 根據紫書,假設k i的整數部分等於p,則k mod i k i p。於是從i,i 1,i 2,j,k除以它們的商的整數部分都相同,則k除以它們的餘數會是乙個等差數列。這樣,可以在列舉i時把它所在的等差數列之和累加到答案中。這需要計算滿足 k j 和 k i p的最大j。...