轻院题库: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;
}
用矩阵乘法做的,调试了半天,竟然一次通过,太出我意外了
|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;
}
相关文章推荐
- (HDU)1022 Train Problem I
- Project Euler -> problem 6
- 更新段&nbsp;POJ-3468-A&nbsp;Simple&nbsp;Problem…
- Project Euler -> problem 7
- The&nbsp;3n&nbsp;+&nbsp;1&nbsp;problem
- Project Euler -> problem 8
- DFS--Prime Ring Problem
- POJ 1207(The 3n + 1 problem)水题
- Project Euler -> problem 9
- Project Euler -> problem 12
- A + B Problem II
- HDOJ&nbsp;&nbsp;1016&nbsp;&nbsp;&nbsp;Prime&nbsp;Ring&nbsp;Problem
- Problem A
- Problem 81 » Red and Black
- hdoj&nbsp;3549&nbsp;Flow&nbsp;Problem(网络流&nbsp;E…
- Problem B
- HDOJ&nbsp;&nbsp;1022&nbsp;&nbsp;&nbsp;Train&nbsp;Problem&nbsp;I
- Problem F
- POJ 1658 Eva's Problem(水到极点)
- poj&nbsp;3468&nbsp;A&nbsp;Simple&nbsp;Problem&nbsp;with&nbsp;I…