您的位置:首页 > 其它

hdu 2855 Fibonacci Check-up

2012-07-26 09:05 381 查看
矩阵乘法,好久没写过了,不过重要的还是找到规律。
http://acm.hdu.edu.cn/showproblem.php?pid=2855
View Code

# include<stdio.h>
# include<string.h>
# include<stdlib.h>
int M;
struct matrix{
int a[2][2];
};
matrix multi(matrix m1,matrix m2)
{
int i,j,k;
matrix mm;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
mm.a[i][j]=0;
for(k=0;k<2;k++)
{
mm.a[i][j]+=m1.a[i][k]*m2.a[k][j];
mm.a[i][j]%=M;
}
}
}
return mm;
}
matrix cal(matrix ma,int m)
{
int ans;
matrix m1;
m1.a[0][0]=1;
m1.a[0][1]=0;
m1.a[1][0]=0;
m1.a[1][1]=1;
while(m)
{
ans=m%2;
if(ans)    m1=multi(m1,ma);
ma=multi(ma,ma);
m/=2;
}
return m1;
}
int main()
{
int n,ncase,ans;
scanf("%d",&ncase);
matrix m1;
while(ncase--)
{
scanf("%d%d",&n,&M);
m1.a[0][0]=1;
m1.a[0][1]=1;
m1.a[1][0]=1;
m1.a[1][1]=0;
n*=2;
if(n==0) {printf("0\n");continue;}
if(n==2) {printf("%d\n",1%M);continue;}
//(f
,f[n-1])=(f[2],f[1])*m1^(n-2)
m1=cal(m1,n-2);
ans=(m1.a[0][0]+m1.a[1][0])%M;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: