[HDU 3306] Another kind of Fibonacci · 矩阵快速幂
2015-09-04 20:22
579 查看
矩阵乘法一眼题。
首先我们根据题意,
可以得到,
我们既然要求
,可以通过求
,而求
就要在矩阵中维护
,
和
所以我们可以得到这样一个矩阵
那么我们还要构造出一个常系数矩阵,结合上面的式子稍微推一推可以得到:
一开始我们可以知道
,所以这个矩阵实际上只要乘n-1次。
首先我们根据题意,
可以得到,
我们既然要求
,可以通过求
,而求
就要在矩阵中维护
,
和
所以我们可以得到这样一个矩阵
那么我们还要构造出一个常系数矩阵,结合上面的式子稍微推一推可以得到:
一开始我们可以知道
,所以这个矩阵实际上只要乘n-1次。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define ll long long #define rep(i,n) for (int i=1;i<=n;i++) const ll mod=10007; ll n,x,y; struct arr{ ll n,m,a[5][5]; void init(int x,int y){ n=x;m=y; memset(a,0,sizeof a); } }ans,ini,unit; arr operator *(const arr A,const arr B){ arr C; C.init(A.n,B.m); rep(i,C.n) rep(j,C.m) rep(k,A.m) C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%mod; return C; } void made(){ ans.init(1,4); ans.a[1][1]=2;ans.a[1][2]=ans.a[1][3]=ans.a[1][4]=1; ini.init(4,4); ini.a[1][1]=1; ini.a[2][1]=ini.a[2][2]=x*x%mod;ini.a[2][3]=1;ini.a[2][4]=x%mod; ini.a[3][1]=ini.a[3][2]=y*y%mod; ini.a[4][1]=ini.a[4][2]=2*x*y%mod;ini.a[4][4]=y%mod; unit.init(4,4); rep(i,4) unit.a[i][i]=1; } int main(){ #ifndef ONLINE_JUDGE freopen("fib.in","r",stdin); #endif while (~scanf("%lld%lld%lld",&n,&x,&y)){ made(); for (n--;n;n>>=1,ini=ini*ini) if (n&1) unit=unit*ini; ans=ans*unit; printf("%lld\n",ans.a[1][1]); } return 0; }
相关文章推荐
- ubuntu发出奇怪的相声
- TMS320F2812启动过程
- iptables端口转发命令
- mysql 中文乱码总结
- 段中的实际数据大小与占用空间大小问题
- 【转】android如何添加权限
- bzoj3505
- 读取视频文件
- OpenCV学习:找出人脸,同时比较两张图片中的人脸相似度
- 初识UML
- CCF 201403-4 无线网络 (二维最短路)
- 【codeforces26A】Almost Prime
- java下io文件切割合并功能加配置文件
- poj 3685 Matrix(二分搜索之查找第k大的值)
- 9-4第二次简单实验
- linux怎样从vi退出到shell
- uva1368 - DNA Consensus String
- 微软Win 10操作系统CPU使用率居高不下怎么办?试试这些方法
- 神经网络的cost function
- 剑指offer 二进制中1的个数