【poj3734】矩阵乘法
2024-08-31 01:37:43
题解:
若当前有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 ;
}
最新文章
- 使用Windbg在XP下Heap追踪失败的原因
- C#读txt文件并写入二维数组中(txt数据行,列未知)
- 爬虫--scrapy--windows上安装
- Android中Parcelable接口的使用
- (一)u-boot-nand.bin的下载
- scala一些高级类型
- N-Queens II
- 04_XML_02_XML语法
- memcache的使用
- stl_map,set 用法
- [UWP]使用Writeable​Bitmap创建HSV色轮
- Oracle Metric sequence load elapsed time
- android 图片内存管理
- 前端页面展示MySQL数据并实现前后端互动
- CMS (内容管理系统)
- iOS: 定义 Block
- LTS原理分析(version:1.6.9)
- javascript技巧总结
- js拼接字符串,字符串转数组
- WebApi Post string 参数 为空