题意: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;
}
点击打开链接