POJ 1012

参考:http://blog.csdn.net/ericxieforever/archive/2008/04/27/2335646.aspx

先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0;依次我们可以来做测试,只要前k轮中只要有一次f(i)<k则此m不符合题意。接下来我们考察一下只剩下k+1个人时候情况,那么依题意则这一轮出局的人要么在上一轮出局人的左边,要么就在右边,设上一轮出局的人为x,则必有m%(k+1)==0或1(还不明白就看下面两个序列表示的k+2人的情况(G表示好人,共有k个,B表示坏人,X表示上一轮出局的人)GG....GGBX,GG...GGXB)。所以测试数为t(k+1)或t(k+1)+1,t>=1。
#include<stdio.h>
int K;
int table[14];
int test(int k,int m)
{
   int r=0;
   int n=K<<1;
   for(int i=0;i<K;i++)
   {
       r=(r+m-1)%(n-i);
       if(r<K)
       {
          return 0;
       }
   }
   return 1;
}
int main()
{
    for(K=1;K<14;K++)
    {
       int m=K+1;
       while(true)
       {

           if(test(K,m))
           {
               table[K]=m;
               break;
           }
           if(test(K,m+1))
           {
               table[K]=m+1;
               break;
           }
           m+=K+1;
       }
    }
    while(scanf("%d",&K)&&K)
    {
        printf("%d\n",table[K]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/lonelycatcher/archive/2011/06/06/2073553.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值