【斐波那契数列】选拔队员

 

=======================

==============================

var
  t,m:longint;
  jz:array[1..2,1..2]of longint;
  n1,m1:longint;
procedure init;
begin
  assign(input,'seat.in');
  assign(output,'seat.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure quick(m:longint);
var
  i,j,k:longint;
  jz_t,jz_n:array[1..2,1..2]of longint;
begin
  jz_t:=jz;
  jz[1,1]:=1; jz[1,2]:=0;
  jz[2,1]:=0; jz[2,2]:=1;
  while n1<>0 do
    begin
      if n1 and 1=1 then
        begin
          fillchar(jz_n,sizeof(jz_n),0);
          for i:=1 to 2 do
            for j:=1 to 2 do
              for k:=1 to 2 do
                jz_n[i,j]:=(jz_n[i,j]+jz_t[i,k]*jz[k,j])mod m;
          jz:=jz_n;
        end;
      fillchar(jz_n,sizeof(jz_n),0);
      for i:=1 to 2 do
        for j:=1 to 2 do
          for k:=1 to 2 do
            jz_n[i,j]:=(jz_n[i,j]+jz_t[i,k]*jz_t[k,j]) mod m;
      jz_t:=jz_n;
      n1:=n1 shr 1;
    end;
end;


procedure main;
var
  i,x:longint;
  ans:longint;
begin
  readln(t,m);
  for i:=1 to t do
    begin
      jz[1,1]:=0; jz[1,2]:=1;
      jz[2,1]:=1; jz[2,2]:=1;
      readln(n1);
      quick(m);
      writeln((jz[2,1]+jz[2,2])mod m);
    end;
end;

begin
  init;
  main;
  terminate;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值