别人的思路,有点递归的意思。程序本身超时,但可以利用它来打表。
这个题目其实就是要求前k次踢掉的都是坏人,假设第i次踢掉的人是i,则i>k。根据题意,可以得到如下关系:
设 ai 是第i次踢掉的人在第i-1次踢掉后剩下的人中是第几个。那么
a(n) = [a(n-1)+m-1]mod(2k-n+1)
要求a(n) > k;n = 1,2,3,...,k
其中2k-n+1是第i-1次踢人后剩下的人数
 1 bool Joseph(int k, int m) // 这个算法确定对于给定的k,m是否满足上面的要求
 2 {
 3     int n=0,a=1;
 4     for(n=1;n<=k;n++)
 5     {
 6         a = (a+m-1)%(k*2-n+1);
 7         if(a == 0)  a = k*2-n+1;
 8         if(a<=k && a>=1)  return false;
 9     }
10     return true;
11 }
 
Code:
 1 #include<iostream>
#include<iostream>
 2 using namespace std;
using namespace std;
 3 bool judge(int k,int m)
bool judge(int k,int m)
 4

 {
{
 5 int i,j=1;
   int i,j=1;         
 6 for(i=1;i<=k;i++)
   for(i=1;i<=k;i++)
 7
 
    {
{
 8 j=(j+m-1)%(k*2+1-i);
        j=(j+m-1)%(k*2+1-i);
 9 if(j==0)  j=k*2+1-i;
        if(j==0)  j=k*2+1-i;
10 if((j<=k)&&(j>=1))
        if((j<=k)&&(j>=1)) 
11 return false;
            return false;
12 }
   }
13 return true;
   return true;
14 }
}
15 int main()
int main()
16

 {
{
17 int k,m,i,j,n;
    int k,m,i,j,n;
18 while(cin>>k)
    while(cin>>k)
19
 
     {
{
20 if(k==0)  break;
        if(k==0)  break;
21 for(m=k+1;;m++)
        for(m=k+1;;m++)
22
 
         {
{
23 if(judge(k,m))
            if(judge(k,m))
24
 
             {
{
25 cout<<m<<endl;
                cout<<m<<endl;
26 break;
                break;
27 }
            }
28 }
        }
29 }
    }
30 }
}