[NJUPSOJ]约瑟夫环
description:
现在有 n 个人, 编号从 0 到 n−1, 站成一圈, 编号为 i 的人右手边是编号为 i+1的人(n−1 的右手边为 0). 进行一种约瑟夫环游戏的变种.
游戏一共进行 n−1轮, 一开始编号为 0 的人手里拿着旗子.
在第 i 轮(从 1 开始数), 手上拿着旗子的人把旗子传给他右手边的人, 一共传 w[i] 次, 传完之后拿着旗子的人退出队伍, 并把旗子传给他右手边的人.
问最后剩在队伍里的人是谁.
input:
第一行n
接下来n-1行录入w[i]
solution:
| 0 | 1 | ... | w | w+1 | ... | n-2 | n-1 |
|---|---|---|---|---|---|---|---|
| w+1 | w+2 | ... | ... | ... | ... | w-1 | |
| 可以看出, \(w\)离开之后, \(w+1\)拿旗, 于是可以建立递推: | |||||||
| \(J_1=0\) | |||||||
| \(J_n=(J_{n-1}+w_n+1) mod\ n\) |
\(J_n\)表示第\(n\)轮结束后, 旗子在\(J_n\)的手上.
表格的第\(0\)列可以一直向下延伸, 直到第\(n-1\)行就是答案.
code:
#include<cstdio>
int main() {
int N, J=0,w;
scanf("%d", &N);
for (int i = 1; i < N; ++i) {
scanf("%d", &w);
J = (J + w + 1) % (i+1);
}
printf("%d\n", J);
}