數論三 約瑟夫問題

2022-05-05 01:36:11 字數 1381 閱讀 8788

描述

小hi和小ho的班級正在進行班長的選舉,他們決定通過一種特殊的方式來選擇班長。

首先n個候選人圍成乙個圈,依次編號為0..n-1。然後隨機抽選乙個數k,並0號候選人開始按從1到k的順序依次報數,n-1號候選人報數之後,又再次從0開始。當有人報到k時,這個人被淘汰,從圈裡出去。下乙個人從1開始重新報數。

也就是說每報k個數字,都會淘汰一人。這樣經過n-1輪報數之後,圈內就只剩下1個人了,這個人就作為新的班長。

舉個例子,假如有5個候選人,k=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號候選人淘汰

對於n=5,k=3的情況,最後當選班長的人是編號為3的候選人。

小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

樣例輸出

3

6思路

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include

11using

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。...