您的位置:首页 > 其它

joj 2693

2010-10-09 22:17 246 查看
这个题先是要推出递推式,

f1(n+1)=2*f1(n)+f2(n);

f2(n+1)=f1(n);

f3(n+1)=f3(n)+f2(n);

然后哥就悲剧了;线性代数学的不好,所以没有从这个3元一次第推式抽象出矩阵;

然后是矩阵的n次方求解;但是要注意的就是每一次除2后要判断奇偶;

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int T,P;
struct matrix//可当模板用
{
//三乘三方阵
matrix(
int m00=0,int m01=0,int m02=0,
int m10=0,int m11=0,int m12=0,
int m20=0,int m21=0,int m22=0
)

{
m[0][0]=(m00);m[0][1]=(m01);m[0][2]=(m02);
m[1][0]=(m10);m[1][1]=(m11);m[1][2]=(m12);
m[2][0]=(m20);m[2][1]=(m21);m[2][2]=(m22);
}
int m[3][3];
/*int m00,m01,m02;
int m10,m11,m12;
int m20,m21,m22;*/
};

matrix matrixmultiply(const matrix& max1,const matrix& max2)
{
matrix max3;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
for(int k=0;k<3;k++)
{
max3.m[i][j]+=((max1.m[i][k]%P)*(max2.m[k][j]%P))%P;
max3.m[i][j]%=P;
}
}

return max3;
}

matrix matrixpower(int n)
{
matrix max4;
if(n==1)
max4=matrix(2,1,0,1,0,0,0,1,1);
else if(n%2==0)
{
max4=matrixpower(n/2);//掉了max4,这里害我跳了好久
max4=matrixmultiply(max4,max4);
}
else if(n%2==1)
{
max4=matrixpower((n-1)/2);
max4=matrixmultiply(max4,max4);
max4=matrixmultiply(max4,matrix(2,1,0,1,0,0,0,1,1));//第二个参数是构造的临时对象

}
//printf("%d/n",max4.m[0][1]);
return max4;
}
int main()
{

while(scanf("%d%d",&T,&P)==2)
{
matrix max5=matrixpower(T);
int N,M;
M=(max5.m[0][0]%P+max5.m[1][0]%P)%P;
N=(max5.m[0][0]%P+max5.m[1][0]%P+max5.m[2][0]%P)%P;
printf("%d %d/n",M,N);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: