求调矩阵快速幂
查看原帖
求调矩阵快速幂
761649
ryf_loser楼主2024/4/5 22:37
#include<cstdio>
#include<cstring>
using namespace std;
inline int in(){
	int x=0,f=1;char c;
	c=getchar();
	while (c<'0'||c>'9'){
		if (c=='-')f=-1;
		c=getchar();
	}
	while (c>='0'&&c<='9'){x=(x<<4)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
const int mod=1e9+7;
int n,a[4][4],b[4][4],t[4][4],q;
inline void work(int x[4][4],int y[4][4]){
	memset(t,0,sizeof t);
	for (int i=1;i<=3;i++)
		for (int j=1;j<=3;j++)
			for (int k=1;k<=3;k++)
				t[i][j]=(t[i][j]+1ll*x[i][k]*y[k][j])%mod;
	memcpy(b,t,sizeof (t));
}
inline void ksm(int l){
	if (l==1){memcpy(b,a,sizeof (a));return ;}
	ksm(l>>1);
	work(b,b);
	if (l&1)work(b,a);
}
int main(){
	q=in();
	while (q--){
		memset(a,0,sizeof a);
		memset(b,0,sizeof b);
		a[1][1]=a[1][3]=a[2][1]=a[3][2]=1;
		b[1][1]=b[2][2]=b[3][3]=1;
		n=in();
		if (n<=3){puts("1");continue;}
		ksm(n);
		printf ("%d\n",b[2][1]);
	}
	return 0;
}
2024/4/5 22:37
加载中...