矩阵乘法模板 bsoj2830

来源:互联网 发布:windows排名 编辑:程序博客网 时间:2024/05/16 09:34

从昨天晚上开始学矩阵乘。。。。

今天早晨突然发现这个题其实10行的暴力可以过。。。

今天下午矩阵乘法彻底包装到了结构里。。以后大概矩阵都是这样写吧。。。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define mod 7#define MAX 90using namespace std;int A,B,n;struct wbysr_matrix{int n,m;int a[MAX][MAX];inline void init(int tn,int tm){n=tn;m=tm;for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)a[i][j]=0;}void print(){for(int i=1;i<=n;i++,printf("\n"))for(int j=1;j<=m;j++)printf("%d ",a[i][j]);}}e,w;inline wbysr_matrix operator *(const wbysr_matrix &a,const wbysr_matrix &b){if(a.m!=b.n)return a;wbysr_matrix c;c.init(a.n,b.m);for(int i=1;i<=a.n;i++)for(int j=1;j<=b.m;j++)for(int k=1;k<=a.m;k++)c.a[i][j]+=(a.a[i][k]*b.a[k][j])%7;return c;}inline wbysr_matrix pow(wbysr_matrix &a,int x){if(x==1)return a;wbysr_matrix b=pow(a,x>>1);b=b*b;if(x%2)b=a*b;return b;}int main(){scanf("%d%d %d",&A,&B,&n);e.init(2,1);e.a[1][1]=e.a[2][1]=1;w.init(2,2);w.a[1][1]=0;w.a[1][2]=1;w.a[2][1]=B;w.a[2][2]=A;wbysr_matrix now;now.init(2,1);now=pow(w,n-1)*e;printf("%d\n",now.a[1][1]%7);return 0;}

0 0