湘潭18 G又见斐波那契 矩阵快速幂

  题意:F(i)= F(i-1)+F(i-2)+i^3+i^2+i+1  (i>=2)  F(1)=1,F(0)=0

给出n,求F(n) n<=1e18

设初始1*6矩阵为 x={f(1),f(0),1,,1,1,1}  (后面4个为i^3,i^2,i^1,i^0.此时i==1)

找到一个递推矩阵A 使得 x *A 可以得到 (f[i+1],f[i],(i+1)^3,(i+1)^2,(i+1)^1,(i+1)^0)

这个矩阵A肯定是6*6 矩阵  草稿纸上搞搞得到A即可.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
const int N=2e5+5,mod=1e9+7;
mat mul(mat a,mat b)
{
	mat c(a.size(),vec(b[0].size()));
	for(int i=0;i<a.size();i++)
	{
		for(int j=0;j<b[0].size();j++)
		{
			c[i][j]=0;
			for(int k=0;k<b.size();k++)
				c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%mod)%mod;
		}
	}
	return c;
}
mat powmod(mat a,ll n)
{
	mat c(a.size(),vec(a.size()));
	for(int i=0;i<a.size();i++)
		c[i][i]=1;
	while(n)
	{
		if(n&1)
			c=mul(c,a);
		a=mul(a,a);
		n>>=1;
	}
	return c;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	mat A(6,vec(6)),x(1,vec(6));
	A={{1,1,0,0,0,0},{1,0,0,0,0,0},{1,0,1,0,0,0},{4,0,3,1,0,0},{6,0,3,2,1,0},{4,0,1,1,1,1}};
	x={{1,0,1,1,1,1}};
	ll T,n;
	cin>>T;
	while(T--)
	{
		cin>>n;
		mat AA=powmod(A,n-1);
		mat res=mul(x,AA);
		cout<<res[0][0]<<'\n';
	}
	return 0;
}
点击打开链接


猜你喜欢

转载自blog.csdn.net/noone0/article/details/80299353