矩阵快速幂
线性代数以前倒是处理过,但矩阵题我从来没写过。。。我最最最兴奋的是终于搞掉P1962了,天知道我盯他多长时间了!!!!
矩乘的时候要注意控制坐标的不是循环顺序而是数组下标,循环该怎么套还是怎么套,完全不用动脑子
P1962
所谓矩阵快速幂 实现方式不是快速幂进矩阵,而是矩阵进快速幂
点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int mod = 1e9+7;
struct node{
long long s[3][3];
};
long long n;
node ans,base;
node mul(node a,node b){
node res;
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
long long sum=0;
for(int k=1;k<=2;k++){
sum=(sum+a.s[i][k]*b.s[k][j])%mod;//bug2取mod
}
res.s[i][j]=sum;
}
}
return res;
}
void power(long long x){
ans.s[1][1]=ans.s[1][2]=1;//bug1初始化
base.s[1][1]=base.s[1][2]=base.s[2][1]=1;
while(x){
if(x&1)ans=mul(ans,base);
base=mul(base,base);
x>>=1;
}
}
int main(){
cin>>n;
if(n<=2)cout<<1;
else {
power(n-2);
cout<<ans.s[1][1];
}
return 0;
}