约瑟夫环是一个经典的数学问题,我们不难发现这样的依次报数,似乎有规律可循
问题: N个人编号为1,2,……,N,依次报数,每报到M时,杀掉那个人,求最后胜利者的编号。
递推公式:
F(N,M) = (F(N − 1,M) + M ) % N
F(N,M)表示: N个人报数,每报到M时被杀,最终幸存者的编号
问题1:
leetcode-5275题
https://leetcode-cn.com/problems/find-the-winner-of-the-circular-game/
int findTheWinner(int n, int k) {
//f[0] = 1;
// f[N,K] = (f[N-1,K] + K) % N;
int x = 0;
for(int i = 1;i <= n;i ++)
x = (x + k) % i;
return x + 1;
}
问题2:
Acwing - 1455招聘
https://www.acwing.com/problem/content/description/1457/
#include<iostream>
#include<vector>
using namespace std;
void solve()
{
int n,m;
cin >> n >> m;
vector<int> cnt(m);
for(int i = 0; i < m; i ++)
{
int x;
cin >> x;
cnt[i] = x;
}
int x = 0;
for(int i = 2; i <= n; i ++)
{
x = (x + cnt[(n - i) % m]) % i;
}
cout << x << endl;
return ;
}
int main()
{
int t = 1;
cin >> t;
while(t --)
{
solve();
}
return 0;
}