HDU-1715 大数 矩阵快速幂

版权声明:本文为博主原创文章,若需要引用、转载,只需注明来源及原文链接,若有错误,欢迎纠正。 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;
}

猜你喜欢

转载自blog.csdn.net/u014137295/article/details/88074411
今日推荐