现在的位置: 首页 > 综合 > 正文

poj3734

2018年01月15日 ⁄ 综合 ⁄ 共 837字 ⁄ 字号 评论关闭

【题意】

有n个方块,现用红黄蓝绿四种颜色将他们染色,要求红色的方块和蓝色的方块个数均为偶数个,求方案数 mod 10007

【输入】

第一行一个t,表示有t组数据

每组数据一个数字表示n

【输出】

对于每组数据,输出一个输出表示方案数

用一个2位的2进制数表示红色方块和蓝色方块的奇偶性,发现染i个的方案数只跟染i-1个的方案数有关

所以可以用矩阵来搞一搞

program poj3734;
type
  square=array [1..4,1..4] of longint;
const
  maxn=10007;
  root:square=((2,1,1,0),
               (1,2,0,1),
               (1,0,2,1),
               (0,1,1,2));
var
  ans:square;
  t,n,i:longint;

function matrixmul (a,b:square):square;
var
  i,j,k:longint;
  ans:square;
begin
  fillchar(ans,sizeof(ans),0);
  for i:=1 to 4 do
    for j:=1 to 4 do
      for k:=1 to 4 do
        ans[i,j]:=(ans[i,j]+a[i,k]*b[k,j]) mod maxn;
  exit(ans);
end;

function power (m:longint):square;
var
  ans,now:square;
begin
  now:=root;
  fillchar(ans,sizeof(ans),0);
  ans[1,1]:=1;
  ans[2,2]:=1;
  ans[3,3]:=1;
  ans[4,4]:=1;
  while m<>0 do
    begin
      if m and 1 = 1 then ans:=matrixmul(ans,now);
      m:=m div 2;
      now:=matrixmul(now,now);
    end;
  exit(ans);
end;

begin
  read(t);
  while t>0 do
    begin
      dec(t);
      read(n);
      ans:=power(n);
      writeln(ans[1,1]);
    end;
end.
【上篇】
【下篇】

抱歉!评论已关闭.