【hoj】 1017 Joseph's problem II

   这个是约瑟夫的另一个变型,变为总共有2*k个人,先是K个好人后是k个坏人,要求前k次都要杀坏人,即在杀掉第一个好人之前就要把所有的坏人都杀光,所以需要我们求出满足这个条件的最小的m值;

   由约瑟夫的递归模型可以发现,我们因为他的递归是从最后杀的人递归到原有的人数,所以我们可以吧顺序反过来,等价于最后杀掉k个坏人,再杀好人,这样在递归的时候就是先知道起始位置(先杀的人),这样就能迭代,由有好人时是否杀的是坏人来判定这个m是否适合,如果k次后杀到了第k个坏人则说明这个m是适合的

参考:http://www.cnblogs.com/wuzhibin/archive/2012/02/17/2356532.html

#include <cstdio>

#include <iostream>

#include <stdlib.h>

#include <memory.h>

#include <math.h>

#include <string.h>

using namespace std;

int a[19];

int main()

{

    int k,m,ans;

    a[10]=93313;

    a[11]=459901;

    a[12]=1358657;

    a[13]=2504881;

    a[14]=13482720;

  while(cin>>k)

    {

        if(k==0) break;

        else if(k>=10) cout<<a[k]<<endl;

        else

        {

        for(m=1;;m++)

        {

            for(ans=0;ans<k;ans++)

            {

                int j=ans;

                for(int i=k+1;i<=2*k;i++)

                j=(j+m)%i;

                if(j>=k) break;

            }

            if(ans==k)

            {

                cout<<m<<endl;

                break;

            }

        }

        }



    }

    return 0;

}

因为oj上有时间限制,所以把大于10的都计算好了。。。这。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值