[POJ 3070] Fibonacci · 矩阵乘法

来源:互联网 发布:矢量软件coreldraw 编辑:程序博客网 时间:2024/06/02 06:32

搞了几年OI从来没见过这么裸的模板题……虽然说矩阵很好推,但是题目都仁慈地把模板给你了……那就拿这题练手了

那剩下来的还能有什么呢?不就是个模板吗,还是个弱化版的……ans表示最后结果的矩阵,unit表示单位矩阵,矩乘一般是用结构体的方式定义(详见struct matrix部分代码)

PS:这是第一次写矩阵乘法,代码非常难看,可以参考上一篇[Vijos 1067]

#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;const int p=10000;struct matrix{int num[3][3],n,m;void init(){memset(num,0,sizeof num);n=m=0;}}ans,unit;int n;matrix operator *(matrix a,matrix b){matrix c;c.init();c.n=a.n;c.m=b.m;for (int i=1;i<=c.n;i++)for (int j=1;j<=c.m;j++)for (int t=1;t<=a.m;t++)c.num[i][j]=(c.num[i][j]+a.num[i][t]*b.num[t][j])%p;return c;}void init(){unit.init();unit.num[1][1]=unit.num[1][2]=unit.num[2][1]=1;unit.n=unit.m=2;ans.init();ans.n=ans.m=2;ans.num[1][1]=ans.num[2][2]=1;}int main(){cin>>n;while (n!=-1){if (!n) {cout<<"0"<<endl;cin>>n;continue;}init();for (;n;n>>=1){if (n&1) ans=ans*unit;unit=unit*unit;}cout<<ans.num[1][2]<<endl;cin>>n;}return 0;}

0 0
原创粉丝点击