法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;
}