博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

K个好人与K个坏人

Posted on 2010-10-19 16:30  桃子在路上  阅读(645)  评论(0编辑  收藏  举报

现在有一圈人,k个好人站在一起,k个坏人站在一起。从第一个好人开始数数。

你要确定一个最小的m,使得在第一个好人被杀死前,k个坏人先被杀死。

输入

一个k,0<k<14

输出

一个m

 

样例:

输入

3

输出

5

另一个样例:

输入

4

输出

30

 

program joseph;

var

  n,i,ans:longint;

  pc:array [1..100] of boolean;

 

procedure init;

begin

  assign(input,'joseph.in');

  reset(input);

  readln(input,n);

  close(input);

end;

 

procedure print(x:longint);

begin

  assign(output,'joseph.out');

  rewrite(output);

  writeln(output,x);

  close(output);

  halt;

end;

 

procedure test(x:longint);

var

  i,jl,js:longint;

  pd:boolean;

begin

  fillchar(pc,sizeof(pc),true);

  jl:=0;

  pd:=true;

  for i:=1 to n do begin

      js:=0;

      repeat

        inc(jl);

        if jl>2*n then jl:=jl mod(2*n);

        if jl=0 then jl:=2*n;

        if pc[jl]=true then inc(js);

      until js=x;

      pc[jl]:=false;

      if jl<=n then begin

         pd:=false;

         break;

         end;

      end;

  if pd=true then print(x);

end;

 

begin

  init;

  i:=n;

  repeat

    inc(i);

    test(i);

  until i>maxlongint;

end.