zoukankan      html  css  js  c++  java
  • poj 3734

    题意:有N个空格,我们可以涂上红,蓝,绿,黄,要求红和绿为偶数个,问多少种方案

    思路:我们假设当前有a种红绿为偶数方案,b种绿红一种为偶数的方案,c种绿红为奇数的方案,那么下一个位置

             ai+1=2*ai+bi;

       bi+1=2*bi+2*ai+2*ci

       ci+1=2*ci+bi

    所以矩阵快速幂搞一搞

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 typedef long long ll;
     8  using namespace std;
     9  const long long mod = 10007;
    10  struct prog
    11  {
    12      long long a[8][8];
    13  };
    14  prog s,B;
    15  prog matrixmul(prog a,prog b)
    16  {
    17     prog c;
    18      for(int i=1;i<4;++i)for(int j=1;j<8;++j)
    19     {
    20        c.a[i][j]=0;
    21        for(int k=1;k<4;k++)
    22             c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
    23          c.a[i][j]%=mod;
    24    }
    25      return c;
    26  }
    27  prog mul(prog s,int k)
    28 {
    29     prog ans;
    30      for(int i=1;i<4;++i)for(int j=1;j<4;++j) ans.a[i][j]=(i==j)?1:0;
    31     while(k){
    32         if(k&1)
    33             ans=matrixmul(ans,s);
    34         k>>=1;
    35        s=matrixmul(s,s);
    36     }
    37      return ans;
    38  }
    39  int main()
    40  {
    41      int t;
    42      scanf("%d",&t);
    43      while(t--){
    44         ll n;
    45         scanf("%I64d",&n);
    46         n--;
    47         B.a[1][1]=2; B.a[1][2]=2; B.a[1][3]=0;
    48         B.a[2][1]=1; B.a[2][2]=2; B.a[2][3]=1;
    49         B.a[3][1]=0; B.a[3][2]=2; B.a[3][3]=2;
    50         s=mul(B,n);
    51         printf("%d
    ",((2*s.a[1][1]+2*s.a[2][1])%mod+mod)%mod);
    52      }
    53      return 0;
    54  }
  • 相关阅读:
    读取数据变JSON传值!
    YII2.0多条件查询升级版
    JS跳转页面方法
    yii的简单片段缓存
    我读过的最好的epoll讲解--转自”知乎“
    I/O多路复用详解
    ”open-close"prinple (OCP)
    获取本机的IPv4或者v6地址
    .Net 下未捕获异常的处理
    TCP断开连接的过程
  • 原文地址:https://www.cnblogs.com/hhxj/p/7225750.html
Copyright © 2011-2022 走看看