洛谷P1962 斐波那契数列 (矩阵快速幂)

题目

学了矩阵,练一下手。。。

#include<bits/stdc++.h>
typedef long long ll; 
const ll mod=1e9+7;
using namespace std;

struct Matrix{
	ll g[3][3];
	Matrix() {
		memset(g,0,sizeof(g));	
	}//矩阵初始化为0 
	Matrix operator *(const Matrix &b) const{//重载乘号 
		Matrix res;
		for(int i=1;i<=2;i++)
			for(int j=1;j<=2;j++)
				for(int k=1;k<=2;k++)
					res.g[i][k]=(res.g[i][k]+g[i][j]*b.g[j][k]%mod)%mod;
		return res;
	}
}a,ans;

void init(){
	a.g[1][1]=1,a.g[1][2]=1,a.g[2][1]=1;
	ans.g[1][1]=ans.g[1][2]=1;
}

void qpow(ll x){//矩阵快速幂 
	while(x){
		if(x&1) ans=ans*a;
		a=a*a;
		x>>=1;
	}
}

int main(){
	ll n;
	cin>>n;
	if(n<=2){
		cout<<1;
		return 0;
	}
	init();
	qpow(n-2);
	cout<<ans.g[1][1]%mod;
	return 0;
}

//没开long long始终都过不了的数据 
//65748392011234567 in 
//188363182 out 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值