poj2244 约瑟夫问题变形

这题只改变起点吧,套公式直接出。

#include
#include
#include
#include
#include
#include
#define maxn 2005
#define INF 0xfffffff
using namespace std;

int check(int n,int m)
{
    int l=0;
    for(int i=2;i<=n;i++)
    {
        l=(l+m)%i;
    }
    l=(l+1-m+1)%n;//这里为什么要加2,我也不太清楚,
    //l+1是最后要杀的人的编号(从1开始),
    //l+1-m转化为杀死的第一个人是1,为啥还得加1嘞
    //公式:l+1+m+k,k是从第几个人开始的意思吧
    if(l<0) l+=n;
    if(l==2)
    return true;
    else
    return false;
}
int main()
{
    int n,m;
    while(scanf("%d",&n)==1)
    {
        if(!n) break;
        for(int i=2;i<=1000;i++)
        {
            if(check(n,i))
            {
                printf("%d\n",i);
                break;
            }
        }
    }
}


你可能感兴趣的:(动态规划)