矩阵专题


先看道板子题

初始化 F1 F2 F3 进行n-1次加速以后 变成 Fn Fn+1 Fn+2

点击查看代码
#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7;
struct node{
	ll m[5][5];
}ans,base;
int T;
node mul(node a,node b){
	node res;
	memset(res.m,0,sizeof(res.m));
	for(int i=1;i<=3;i++)
	for(int j=1;j<=3;j++)
	for(int k=1;k<=3;k++)
	res.m[i][j]=(res.m[i][j]+(a.m[i][k]*b.m[k][j])%mod)%mod;
	return res;
}
ll fast_mi(int b){
	node res;
	memset(res.m,0,sizeof(res.m));
	for(int i=1;i<=3;i++)
	res.m[i][i]=1;
	memset(base.m,0,sizeof(base.m));
	base.m[1][1]=base.m[1][3]=base.m[2][1]=base.m[3][2]=1;
	while(b){
		if(b&1)res=mul(res,base);
		base=mul(base,base);
		b>>=1;
	}
	return res.m[1][1];
}
void solve();
int main(){
	cin>>T;
	while(T--)solve();
     return 0;
}
void solve(){
	int n;
	cin>>n;
	 cout<

同理来计算斐波那契数

有个有趣的公式 gcd(f(n),f(m))=f(gcd(n,m))

#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7;
struct node{
	ll m[5][5];
}ans,base;
int T;
node mul(node a,node b){
	node res;
	memset(res.m,0,sizeof(res.m));
	for(int i=1;i<=2;i++)
	for(int j=1;j<=2;j++)
	for(int k=1;k<=2;k++)
	res.m[i][j]=res.m[i][j]+a.m[i][k]*b.m[k][j];
	return res;
}
ll fast_mi(int b){
	node res;
	memset(res.m,0,sizeof(res.m));
	for(int i=1;i<=2;i++)
	res.m[i][i]=1;
	memset(base.m,0,sizeof(base.m));
	base.m[1][1]=base.m[1][2]=base.m[2][1]=1;
	while(b){
		if(b&1)res=mul(res,base);
		base=mul(base,base);
		b>>=1;
	}
	return res.m[1][1];
}
void solve();
int main(){
	cin>>T;
	while(T--)solve();
     return 0;
}
void solve(){
	int n;
	cin>>n;
	 cout<