题意:约瑟夫环 初始前k个人后k个人 问m等于多少的时候 后k个先出去
题解:因为前k个位置是不动的,所以只要考虑每次递推后的位置在不在前面k个就行
有递推式 ans[i]=(ans[i-1]+m-1)%(n-i-1) 其中i是轮数 ans[i]是i出局的位置 出局后后面的补到前面 也就是i+1轮开始的位置了 m是数多少个出去
这里的是从0开始的,而题目是从一开始 ,平移一下即可 只要ans[i] 前K次不落在前K个即可 打表也行
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans[];
int a[];
int main(){
int n;
while(cin>>n&&n){
n*=;
ans[]=;
if(a[n/]){
cout<<a[n/]<<endl;
continue;
}
for(int i=;;i++){
int ok=;
for(int j=;j<=n/;j++){
ans[j]=(ans[j-]+i-)%(n-j+);
if(ans[j]<n/){
ok=;
break;
}
}
if(ok){
printf("%d\n",i);
a[n/]=i;
break;
}
}
}
return ;
}