1304.约瑟夫环的强化版
Description
约瑟夫环问题的简单强化版。约瑟夫环是这样的:n个人组成一个环,编号为1,2...N,站在圆圈的每第m个将出列,直到所有人都出列。例如,当n= 6和m = 5那么5,4,6,2,3和1将按顺序逐一出列。
假设有k好人和k坏人组成一个环。在圈内的前k是好人和最后K个坏人。由你来确定,所有的坏人会在好人之前出列的最小m。
多组测试样例,每个测试样例一个k(0≤k≤14),当k=0时测试终止
最小m
3
4
0
Sample Output
5
30
约瑟夫环问题,正常跑的话肯定会很慢,但是这题k只到14......所以,偷个懒直接打表到14就好了= =
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int k;
while(scanf("%d",&k)!=EOF)
{
if(k==0)
break;
switch(k)
{
case 1:cout<<2<<endl;break;
case 2:cout<<7<<endl;break;
case 3:cout<<5<<endl;break;
case 4:cout<<30<<endl;break;
case 5:cout<<169<<endl;break;
case 6:cout<<441<<endl;break;
case 7:cout<<1872<<endl;break;
case 8:cout<<7632<<endl;break;
case 9:cout<<1740<<endl;break;
case 10:cout<<93313<<endl;break;
case 11:cout<<459901<<endl;break;
case 12:cout<<1358657<<endl;break;
case 13:cout<<2504881<<endl;break;
case 14:cout<<13482720<<endl;break;
default:break;
}
}
return 0;
}
/*打表,反正样例k只到14,打到14就行了,偷个懒啦~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int fun(int m,int k,int i)
{
if(i==1)
return (m+k-1)%m;
else
return (fun(m-1,k,i-1)+k)%m;
}
int main()
{
int a;
int t;
int i,j;
int sum,goal;
while(scanf("%d",&a)!=EOF)
{
goal=0;
for(i=a-1;i>=a/2;i--)
{
goal=goal+i;
}
for(j=1;;j++)
{
sum=0;
for(i=1;i<=a/2;i++)
{
t=fun(a,j,i);
sum=sum+t;
}
if(sum==goal)
{
cout<<a/2<<" = "<<j<<endl;
break;
}
}
}
return 0;
}
*/