TOJ 1007 Joseph
別人的思路,有點遞歸的意思。程序本身超時,但可以利用它來打表。
這個題目其實就是要求前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 }
1#include<iostream>
2using namespace std;
3bool judge(int k,int m)
4{
5int i,j=1;
6for(i=1;i<=k;i++)
7![]()
{
8j=(j+m-1)%(k*2+1-i);
9if(j==0) j=k*2+1-i;
10if((j<=k)&&(j>=1))
11return false;
12}
13return true;
14}
15int main()
16{
17int k,m,i,j,n;
18while(cin>>k)
19![]()
{
20if(k==0) break;
21for(m=k+1;;m++)
22![]()
{
23if(judge(k,m))
24![]()
{
25cout<<m<<endl;
26break;
27}
28}
29}
30}