题意:约瑟夫环 初始前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个即可 打表也行
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int ans[1005]; 7 int a[3000]; 8 int main(){ 9 int n; 10 while(cin>>n&&n){ 11 n*=2; 12 ans[0]=0; 13 if(a[n/2]){ 14 cout<<a[n/2]<<endl; 15 continue; 16 } 17 for(int i=1;;i++){ 18 int ok=1; 19 for(int j=1;j<=n/2;j++){ 20 ans[j]=(ans[j-1]+i-1)%(n-j+1); 21 if(ans[j]<n/2){ 22 ok=0; 23 break; 24 } 25 } 26 if(ok){ 27 printf("%d ",i); 28 a[n/2]=i; 29 break; 30 } 31 } 32 } 33 return 0; 34 }