2016东莞市特长生考试 游戏问题

2016东莞市特长生考试 游戏问题

Description

“五四”青年节到了,某学校要举行一个游园活动,其中有一个这样的游戏: n 个同学(编号从 0 到 n-1)围坐一圈,按照顺时针方向给 n 个位置编号,从0 到 n-1。最初,第 0 号同学在第 0 号位置,第 1 号同学在第 1 号位置,„„, 

依此类推。 
游戏规则如下:每一轮第 0 号位置上的同学顺时针走到第 m 号位置,第 1号位置同学走到第 m+1 号位置,„„,依此类推,第 n − m 号位置上的同学走到第 0 号位置,第 n-m+1 号位置上的同学走到第 1 号位置,„„,第 n-1 号位置上的同学顺时针走到第 m-1 号位置。 

现在,一共进行了 10^k 轮,请问 x 号同学最后走到了第几号位置。

Input

从文件 game.in 读入数据,输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。

Output

结果输出到文件 game.out,输出共 1 行,包含 1 个整数,表示 10^k 轮后 x 号小伙伴所在的位置编号。


分析:经过n轮后每个人都会回到原来的位置,所以只要模拟10^k mod n轮,用快速幂求出10^k mod n即可。


代码

var
  a:array[0..1000000] of longint;
  p,n,m,k,x,i,j,l:longint;


procedure try(t:longint);
begin
  if t=0 then p:=1
    else begin
           try(t div 2);
           p:=(p mod n)*(p mod n) mod n;
           if odd(t) then p:=(p mod n)*(10 mod n);
         end;
end;


begin
  //assign(input,'game.in');reset(input);
  //assign(output,'game.out');rewrite(output);
  readln(n,m,k,x);
  try(k);
  for i:=0 to n-1 do
    begin
      a[i]:=i-p*m;
      while a[i]<0 do
        a[i]:=a[i]+n;
      if a[i]=x then
        begin
          writeln(i);
          //close(input);close(output);
          halt;
        end;
    end;
end.

你可能感兴趣的:(二分,模拟)