[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);
}
posted @ 2021-01-28 16:52  _dwt  阅读(33)  评论(0)    收藏  举报