您的位置:首页 > 其它

uva 10870 递推关系矩阵快速幂模

2013-09-04 15:52 281 查看
RecurrencesInput:standardinputOutput:standardoutput

Considerrecurrentfunctionsofthefollowingform:

f(n)=a1f(n-1)+a2f(n-2)+a3f(n-3)+...+adf(n-d),forn>d.a1,a2,...,ad-arbitraryconstants.

AfamousexampleistheFibonaccisequence,definedas:f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2).Hered=2,a1=1,a2=1.

Everysuchfunctioniscompletelydescribedbyspecifyingd(whichiscalledtheorderofrecurrence),valuesofdcoefficients:a1,a2,...,ad,andvaluesoff(1),f(2),...,f(d).You'llbegiventhesenumbers,andtwointegersnandm.Yourprogram'sjobistocomputef(n)modulom.

Input

Inputfilecontainsseveraltestcases.Eachtestcasebeginswiththreeintegers:d,n,m,followedbytwosetsofdnon-negativeintegers.Thefirstsetcontainscoefficients:a1,a2,...,ad.Thesecondsetgivesvaluesoff(1),f(2),...,f(d).

Youcanassumethat:1<=d<=15,1<=n<=231-1,1<=m<=46340.Allnumbersintheinputwillfitinsigned32-bitinteger.

Inputisterminatedbylinecontainingthreezeroesinsteadofd,n,m.Twoconsecutivetestcasesareseparatedbyablankline.

Output

Foreachtestcase,printthevalueoff(n)(modm)onaseparateline.Itmustbeanon-negativeinteger,lessthanm.

SampleInputOutputforSampleInput

11100

2

1


210100

11

11


3214748364712345

12345678012345

123

000

1

55

423


[align=center][/align]
题目大意:f(n)=a1*f(n-1)+a2*f(n-2)+.....+ad*f(n-d)

#include<iostream>
#include<cstring>
#include<cstdio>
usingnamespacestd;

#defineMax20
typedeflonglongLL;

structMatrix
{
LLa[Max][Max];
intn;
};

MatrixMatrix_mult_mod(MatrixA,MatrixB,intm)
{
inti,j,k;
MatrixC;
C.n=A.n;
memset(C.a,0,sizeof(C.a));
for(i=1;i<=A.n;i++)
{
for(j=1;j<=A.n;j++)
{
for(k=1;k<=A.n;k++)
{
C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%m;
}
}
}
returnC;
}

MatrixMatrix_pow_mod(MatrixA,intn,intm)
{
Matrixt;
inti,j;
t.n=A.n;
memset(t.a,0,sizeof(t.a));
for(i=1;i<=A.n;i++)t.a[i][i]=1;
for(i=1;i<=A.n;i++)
for(j=1;j<=A.n;j++)
A.a[i][j]%=m;
while(n)
{
if(n&1)t=Matrix_mult_mod(t,A,m);
n>>=1;
A=Matrix_mult_mod(A,A,m);
}
returnt;
}

voiddeal(intd,intn,intm)
{
inti,j;
LLdd[Max],dd1[Max];
MatrixA;
A.n=d;
memset(A.a,0,sizeof(A.a));
for(i=1,j=2;j<=d;i++,j++)A.a[i][j]=1;
for(j=d,i=1;i<=d;i++,j--)scanf("%ll",&A.a[d][j]);
for(i=1;i<=d;i++)scanf("%ll",dd+i);
A=Matrix_pow_mod(A,n-d,m);
for(i=1;i<=d;i++)
{
dd1[i]=0;
for(j=1;j<=d;j++)
dd1[i]=(dd1[i]+A.a[i][j]*dd[j])%m;
}
printf("%ll\n",dd1[d]);
}

intmain()
{
intd,n,m;
while(scanf("%d%d%d",&d,&n,&m),d+n+m)
deal(d,n,m);
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: