AcWing 1455. 招聘
原题链接
中等
作者:
沙漠绿洲
,
2020-08-19 15:50:41
,
所有人可见
,
阅读 2400
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N];
/*
约瑟夫环递推公式:
f(1) = 0; //表示最后一轮的胜出者当前编号是0
f(x) = (f(x - 1) + m) % x , 1 < x <= n //每一轮都找到胜出者在上一轮中的编号
不过本题里m是在变化的,所以要相应地变为:
==> f(x) = (f(x - 1) + a[(n - x) % m]) % x, 1 < x <= n
*/
int main()
{
int T;
cin >> T;
while(T --){
int n, m;
cin >> n >> m;
for(int i = 0; i < m; ++ i) scanf("%d", &a[i]);
int ret = 0;
for(int i = 2; i <= n; ++ i){
ret = (ret + a[(n - i) % m]) % i;
}
cout << ret << endl;
}
return 0;
}
f(x) = (f(x + 1) + m) % x, (x + 1) 应该为x - 1吧?
对的,已改正