poj3734

【题意】

有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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值