求助矩阵加速80pts
查看原帖
求助矩阵加速80pts
278259
RemiliaScar1et楼主2020/8/30 20:01

RT,感觉思路没什么问题 (逃

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MOD=1e9+7;
const int N=3;//阶

struct Mar
{
	ll m_[N][N];
};

Mar operator*(const Mar &x,const Mar &y)//矩阵乘法
{
	Mar tmp;
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			tmp.m_[i][j]=0;
		}
	}
	
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			for(int k=0;k<N;k++)
			{
				tmp.m_[i][j]+=x.m_[i][k]*y.m_[k][j]%MOD;
				tmp.m_[i][j]%=MOD;
			}
		}
	}
	return tmp;
}

ll bts[N][N]={
	{1,1,0},
	{0,0,1},
	{1,0,0}
};

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	Mar A,F;
	
	ll t;
	cin>>t;
	while(t--)
	{
		memset(F.m_,0,sizeof F.m_);
		F.m_[0][0]=F.m_[0][1]=F.m_[0][2]=1;
		memcpy(A.m_,bts,sizeof bts);//初始化
		
		ll n;
		cin>>n;
		if(n<=3)
		{
			puts("1"); continue;
		}
		else n-=3;//需要乘的次数
		
		while(n)
		{
			if(n&1) F=F*A;
			A=A*A;
			n>>=1;
		}
		
		cout<<F.m_[0][0]<<endl;
	}
	return 0;
}
2020/8/30 20:01
加载中...