您的位置:首页 > 其它

轻院题库:1478  Problem B:不死兔…

2012-12-05 17:07 218 查看
不死兔子,斐波那契数列

用矩阵乘法做的,调试了半天,竟然一次通过,太出我意外了

|0 1|
*|f[i-1]|=   |
f[i] |

|1 1|  |
f[i] |    |f[i+1]|

两矩阵相乘就得出来了,然后根据乘法交换率,先算出前面矩阵的n次幂就行了

#include<stdio.h>

#include<string.h>

__int64 x[2][2],y[2][2];

void cheng(int s)

{

 __int64 a[2][2],b[2][2];

 if(s==0){

  a[0][0]=x[0][0];a[0][1]=x[0][1];a[1][0]=x[1][0];a[1][1]=x[1][1];

  b[0][0]=y[0][0];b[0][1]=y[0][1];b[1][0]=y[1][0];b[1][1]=y[1][1];

 }

 else{

  b[0][0]=y[0][0];b[0][1]=y[0][1];b[1][0]=y[1][0];b[1][1]=y[1][1];

  a[0][0]=y[0][0];a[0][1]=y[0][1];a[1][0]=y[1][0];a[1][1]=y[1][1];

 }

 y[0][0]=(a[0][0]*b[0][0]+a[0][1]*b[1][0])
11403;

 y[0][1]=(a[0][0]*b[0][1]+a[0][1]*b[1][1])
11403;

 y[1][0]=(a[1][0]*b[0][0]+a[1][1]*b[1][0])
11403;

 y[1][1]=(a[1][0]*b[0][1]+a[1][1]*b[1][1])
11403;

}

int main()

{

 int m,n,i;

 char a[1002];

 scanf("%d",&m);

 while(m--)

 {

  x[0][0]=y[0][0]=0;

  x[0][1]=x[1][0]=x[1][1]=y[0][1]=y[1][0]=y[1][1]=1;

  scanf("%d",&n);n++;

  for(i=0;n>0;i++)

  {

   a[i]=n%2+'0';

   n=n/2;

  }

  a[i]='\0';

  strrev(a);

  for(i=1;a[i];i++)

  {

    
cheng(1);

   if(a[i]=='1')

    cheng(0);

  }

  printf("%I64d\n",y[0][1]);

 }

 return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: