题解:

若当前有i个格子。
2个是偶数的方案数为a[i]
1个是偶数的方案数为b[i]
0个是偶数的方案数为c[i]

a[i+1]=2*a[i](i+1染成黄或蓝)+b[i](把奇数变为偶数)
b[i+1]=2*a[i](把某个偶数变为奇数)+2*b[i](i+1染成黄或蓝)+2*c[i](把某个奇数变为偶数)
c[i+1]=b[i](把偶数变为奇数)+2*c[i](i+1染成黄或蓝)

解析式难想,要学会这种分类递推的方法。

然后就可以推出

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=,Mod=; struct node{
int sx,sy;
int s[][];
}; node mult(node a,node b)
{
node c;
c.sx=a.sx;c.sy=b.sy;
memset(c.s,,sizeof(c.s));
for(int i=;i<=a.sx;i++)
for(int j=;j<=b.sy;j++)
for(int k=;k<=a.sx;k++)
{
c.s[i][j]+=(a.s[i][k]*b.s[k][j])%Mod;
c.s[i][j]%=Mod;
}
return c;
} void solve(int x)
{
node a;
a.sx=a.sy=;
a.s[][]=;a.s[][]=;a.s[][]=;
a.s[][]=a.s[][]=a.s[][]=;
a.s[][]=;a.s[][]=;a.s[][]=;
node b;
b.sx=b.sy=;
memset(b.s,,sizeof(b.s));
for(int i=;i<=;i++) b.s[i][i]=;
while(x)
{
if(x&) b=mult(b,a);
a=mult(a,a);
x>>=;
}
node c;
c.sx=;c.sy=;
c.s[][]=;
c.s[][]=c.s[][]=;
c=mult(b,c); printf("%d\n",c.s[][]);
return ;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int x;
scanf("%d",&x);
solve(x);
}
return ;
}

最新文章

  1. 使用Windbg在XP下Heap追踪失败的原因
  2. C#读txt文件并写入二维数组中(txt数据行,列未知)
  3. 爬虫--scrapy--windows上安装
  4. Android中Parcelable接口的使用
  5. (一)u-boot-nand.bin的下载
  6. scala一些高级类型
  7. N-Queens II
  8. 04_XML_02_XML语法
  9. memcache的使用
  10. stl_map,set 用法
  11. [UWP]使用Writeable​Bitmap创建HSV色轮
  12. Oracle Metric sequence load elapsed time
  13. android 图片内存管理
  14. 前端页面展示MySQL数据并实现前后端互动
  15. CMS (内容管理系统)
  16. iOS: 定义 Block
  17. LTS原理分析(version:1.6.9)
  18. javascript技巧总结
  19. js拼接字符串,字符串转数组
  20. WebApi Post string 参数 为空

热门文章

  1. Thymeleaf 常用th标签基础整理
  2. nginx proxy_cache缓存详解
  3. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)
  4. 每天一个Linux命令(12):su命令
  5. Spring实战第五章学习笔记————构建Spring Web应用程序
  6. Micro Average vs Macro average Performance in a Multiclass classification setting
  7. Python 3 学习笔记之——面向对象
  8. 去西交大考PAT认证
  9. cmp快排 结构体快排
  10. 二分图最大权匹配:Kuhn-Munkres算法