法1(队列法)

简单来说就是一个边出边存的小问题
用经典的队列解决约瑟夫环
https://blog.csdn.net/m0_51506743/article/details/124004350
有了这个前置知识就是在该问题基础上先走k次
比较简单就直接上代码了

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,k,m;
	cin>>n>>k>>m;
	queue<int>q;
	for(int i=0;i<n;i++)
	{
		q.push(i);
	}
	int f=0;
	while(k--)
	{
		f=q.front();
		q.pop();
		q.push(f);
	}
	int j=1;
	while(q.size()!=1)
	{
		if(j==m)
		{
		f=q.front();
		q.pop();
		j=1;
		}
		else{
		f=q.front();
		q.pop();
		q.push(f);
		j++; 
		} 
	}
	cout<<q.front();
	return 0;
 } 

法2(公式法)

先常规的上连接:https://blog.csdn.net/u011500062/article/details/72855826
ok了啊兄弟们
直接上代码

  #include <iostream>
using namespace std;
void solve(int n,int k,int m) {
    int p=0; 
    for(int i=2;i<=n;i++) p=(p+m)%i;
    cout<<(p+k)%n<<endl;; 
}
int main()
{
    int n,k,m;
    cin >> n >> k >> m;
    solve(n,k,m);
    return 0;
}