题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1073
解题方案:约瑟夫环的经典解题方案——一人出列以后重新排列,变成和原问题相似的规模更小的子问题,再找出映射规则,即递推。
参考博客:约瑟夫环问题(数学方法)
当只剩下一个人的时候,即在O(1)规模下他的编号为0。通过递推,也就是层层映射,不断还原最后胜利者在O(2)、O(3) ...... O(n)规模下的编号,最终得到胜利者的原始编号。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define FOR(i,k,n) for(int i=k;i<n;i++)
#define FORR(i,k,n) for(int i=k;i<=n;i++)
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mst(a,n) memset(a,n,sizeof(a))
#define ll long long
#define N 1005
#define mod 1000000007
#define INF 0x3f3f3f3f
const double eps=1e-8;
const double pi=acos(-1.0);
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
cin>>n>>m;
int ans=0;
FORR(i,2,n)
ans=(ans+m)%i;
cout<<ans+1<<endl;
return 0;
}