版权声明:本文为博主原创文章,若需要引用、转载,只需注明来源及原文链接,若有错误,欢迎纠正。 https://blog.csdn.net/u014137295/article/details/88074411
Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3
计算第n项Fibonacci数值。
Input
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)
Output
输出为N行,每行为对应的f(Pi)。
Sample Input
5
1
2
3
4
5
Sample Output
1
1
2
3
5
代码:
#include<bits/stdc++.h>
#define MAXN 9999
#define MAXSIZE 1000
#define DLEN 4
using namespace std;
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch>'9'||ch<'0')f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return f?-x:x;
}
class BigNum{
private:
int a[MAXSIZE];
int len;
public:
BigNum(){len=1;memset(a,0,sizeof(a));}
BigNum(int d){
int c;
len=0;
memset(a,0,sizeof(a));
while(d>MAXN){
c=d-(d/(MAXN+1))*(MAXN+1);
d=d/(MAXN+1);
a[len++]=c;
}
a[len++]=d;
};
BigNum operator=(const BigNum &n){
len=n.len;
memset(a,0,sizeof(a));
for(int i=0;i<len;++i)a[i]=n.a[i];
return *this;
};
BigNum operator+(const BigNum &T) const{
BigNum t(*this);
int i,big;
big=T.len>len?T.len:len;
for(i=0;i<big;++i){
t.a[i]+=T.a[i];
if(t.a[i]>MAXN){
++t.a[i+1];
t.a[i]-=MAXN+1;
}
}
if(t.a[big]!=0)t.len=big+1;
else t.len=big;
return t;
};
BigNum operator*(const BigNum &T) const{
BigNum ret;
int i,j,up,temp,temp1;
for(i=0;i<len;++i){
up=0;
for(j=0;j<T.len;++j){
temp=a[i]*T.a[j]+ret.a[i+j]+up;
if(temp>MAXN){
temp1=temp-temp/(MAXN+1)*(MAXN+1);
up=temp/(MAXN+1);
ret.a[i+j]=temp1;
}else up=0,ret.a[i + j]=temp;
}
if(up!=0)ret.a[i+j]=up;
}
ret.len=i+j;
while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
return ret;
};
void print(){
printf("%d",a[len-1]);
for(int i=len-2;i>=0;--i)printf("%04d",a[i]);
putchar('\n');
};
};
struct mat{
BigNum a11,a12,a21,a22;
};
mat matmultipy(mat a,mat b){
mat ans={
a.a11*b.a11+a.a21*b.a12,a.a12*b.a11+a.a22*b.a12,
a.a11*b.a21+a.a21*b.a22,a.a12*b.a21+a.a22*b.a22
};
return ans;
}
void matqpow(int k){
mat ans={1,0,0,1},base={1,1,1,0};
while(k){
if(k&1)ans=matmultipy(ans,base);
base=matmultipy(base,base);
k>>=1;
}
ans.a11.print();
}
int main(){
int t=read();
while(t--)matqpow(read()-1);
return 0;
}