原題傳送門
具體數學上看的一愣一愣的,自己瞎想了想好像明白了
假設現在有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 最後剩下的人的編...