題解 51nod1074 約瑟夫環V2

2021-09-26 13:25:30 字數 1014 閱讀 6080

原題傳送門

具體數學上看的一愣一愣的,自己瞎想了想好像明白了

假設現在有n

nn個人,先是淘汰第k

kk個人,剩下(n−

1)

(n-1)

(n−1

)個人是這樣排列的:k+1

,k+2

,...

,n,1

,2,.

..,k

−2,k

−1

k+1,k+2,...,n,1,2,...,k-2,k-1

k+1,k+

2,..

.,n,

1,2,

...,

k−2,

k−1若是我們知道(n−

1)

(n-1)

(n−1

)個人中倖存者是x

xx,那麼一一對映,n

nn個人的倖存者就是(x+

k)

(x+k)

(x+k)%n

nn得到遞推關係ans

i=(a

nsi−

1+k)

ans_i=(ans_+k)

ansi​=

(ans

i−1​

+k)%i

ii,然後最終+1

但是時間複雜度為o(n

)o(n)

o(n)

,不行想到一次可以加一大堆k上去再取模,但不能加的太大導致答案出錯,所以得到每次加的k的係數是i−a

nsk+

1\frac+1

ki−ans

​+1這樣一堆一堆的加就沒問題了

code:

#include

#define ll long long

using

namespace std;

intmain()

printf

("%lld\n"

, ans +1)

;return0;

}

51nod 1074 約瑟夫環V2

1074 約瑟夫環 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 n個人坐成乙個圓環 編號為1 n 從第1個人開始報數,數到k的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。例如 n 3,k 2。2號先出列,然後是1號,最後剩下的是3號。inp...

51nod 1074 約瑟夫環 V2

1074 約瑟夫環 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 n個人坐成乙個圓環 編號為1 n 從第1個人開始報數,數到k的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。例如 n 3,k 2。2號先出列,然後是1號,最後剩下的是3號。inp...

51Nod1074 約瑟夫環 V2

n個人坐成乙個圓環 編號為1 n 從第1個人開始報數,數到k的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。例如 n 3,k 2。2號先出列,然後是1號,最後剩下的是3號。input 2個數n和k,表示n個人,數到k出列。2 n 10 18,2 k 1000 output 最後剩下的人的編...