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;
}
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;
}
相关文章推荐
- joj 儿死三八
- JOJ 1106 Complicated Expressions
- JOJ 1064: Caeser Comes Back 解题报告
- joj 1107: Factorial
- 忘了是joj第几题了 剩余定理
- joj 2319
- joj 1595 Combinations
- joj 1857 Catenyms
- joj 2734: keyword DFA 求字符串最多匹配多少字符串 每个子串最多匹配多少个 优化算法
- JOJ 1089 & ZOJ 1060 & poj 1094 Sorting It All Out (邻接表的栈拓扑排序模板)
- joj 1509
- joj2471
- joj 2724: Hua Rong Dao 最小割
- joj1006
- joj 1317
- joj 2717
- JOJ2573:Product of two primes
- joj 1928
- JOJ 1006解题
- joj 2512 Groups 并查集