您的位置:首页 > 产品设计 > UI/UE

[矩阵快速幂]HDU 5950 Recursive sequence

2017-07-07 09:50 489 查看


题意:f(n)=2f(n-2)+f(n-1)+n^4,已知f(1),f(2)求f(n)%mod

n4也需要参与矩阵计算中,构造递推关系即可。

递推公式如下:

(n+1)^4=n^4+4n^3+6n^2+4n+1;

(n+1)^3=n^3+3n^2+3n+1;

(n+1)^2=n^2+2n+1;

(n+1)^1=n+1;

(n+1)0=1;

假设最右矩阵为[f(n-1),f(n-2),n^4,n^3,n^2,n,1]T,

构造正确的求[f(n),f(n-1),(n+1)^4,(n+1)^3,(n+1)^2,(n+1),1]T的矩阵就没什么难度了。
const int siz=7;
int N=7;
Mytype mod=2147493647;
struct matrix
{
Mytype a[siz][siz];
matrix operator*(const matrix &y)const
{
matrix res;
mem(res.a,0);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(a[i][j])
for(int k=0;k<N;k++)
res.a[i][k]+=a[i][j]*y.a[j][k],res.a[i][k]%=mod;
return res;
}
matrix operator+(const matrix &y)const
{
matrix res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.a[i][j]=a[i][j]+y.a[i][j],res.a[i][j]%=mod;
return res;
}
matrix operator*=(const matrix &y)
{
*this=y* *this;
return *this;
}
};
matrix qmod(matrix a,int k)
{
matrix res;
mem(res.a,0);
for(int i=0;i<N;i++)
res.a[i][i]=1;
while(k)
{
if(k&1)
res*=a;
a*=a;
k>>=1;
}
return res;
}
int main()
{
matrix a;
mem(a.a,0);
a.a[0][0]=1,a.a[0][1]=2,a.a[0][2]=1;
a.a[1][0]=1;
a.a[2][2]=1,a.a[2][3]=4,a.a[2][4]=6,a.a[2][5]=4,a.a[2][6]=1;
a.a[3][3]=1,a.a[3][4]=3,a.a[3][5]=3,a.a[3][6]=1;
a.a[4][4]=1,a.a[4][5]=2,a.a[4][6]=1;
a.a[5][5]=1,a.a[5][6]=1;
a.a[6][6]=1;
T_T{
int n;
ll f1,f2;
scanf("%d%lld%lld",&n,&f1,&f2);
f1%=mod;
f2%=mod;
if(n==1){
OT(f1),pe();
continue;
}
else if(n==2){
OT(f2),pe();
continue;
}
matrix b=qmod(a,n-2);
ll t[]={f2,f1,81,27,9,3,1};
ll ans=0;
for(int i=0;i<7;i++)
ans=(ans+t[i]*b.a[0][i]%mod)%mod;
OT(ans),pe();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matrix