题目:点击打开链接
一个矩阵乘法问题,(1+sqrt(2))的n次方!
#include<bits/stdc++.h>
using namespace std;
#define maxn (1000000007)
struct Mat{
long long mat[2][2];
};
Mat init(Mat x){
x.mat[0][0]=1;
x.mat[0][1]=2;
x.mat[1][0]=1;
x.mat[1][1]=1;
return x;
}
Mat operator+(Mat a,Mat b)
{
Mat c;
int i,j;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
c.mat[i][j] = a.mat[i][j]+b.mat[i][j];
}
return c;
}
Mat operator*(Mat a,Mat b)
{
int i,j,k;
Mat c;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
{
c.mat[i][j] = 0;
for (k=0;k<2;k++)
{
c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%maxn;
c.mat[i][j]=(c.mat[i][j]+maxn)%maxn;
}
//c.mat[i][j]%=MOD;
}
}
return c;
}
Mat operator^(Mat a,long long x)
{
Mat p=a;
Mat q;
q=init(q);
while (x>=1)
{
if(x%2==1)
p = p*q;
x/=2;
q = q*q;
}
return p;
}
int main(){
long long n;
cin>>n;
Mat ans;
ans.mat[0][0]=1;
ans.mat[0][1]=0;
ans.mat[1][0]=0;
ans.mat[1][1]=1;
if(n==0){
printf("1\n");
}
else if(n%2==1){
ans=ans^n;
printf("%I64d\n",(ans.mat[1][0]*ans.mat[0][1])%maxn);
}
else{
ans=ans^n;
printf("%I64d\n",(ans.mat[0][0]*ans.mat[1][1])%maxn);
}
return 0;
}