程序求调
  • 板块灌水区
  • 楼主absolute_value
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/29 19:23
  • 上次更新2023/11/2 10:48:45
查看原帖
程序求调
1067907
absolute_value楼主2023/10/29 19:23

矩阵快速幂求斐波那契数列第n项

#include<bits/stdc++.h>
using namespace std;
class rect {
	public:
		int width;
		int height;
		long long a[1000][1000];
		long long &mem(int x,int y) {
			return a[x-1][y-1];
		}
		void set(int x,int y) {
			width=x;
			height=y;
			for(int i=0; i<x; i++) {
				for(int j=0; j<y; j++) {
					a[i][j]=0;
				}
			}
		}
		rect operator*(rect x) {
			rect y;
			y.set(height,x.width);
			for(int i=0; i<height; i++) {
				for(int j=0; j<x.width; j++) {
					for(int k=0; k<width; k++) {
						y.mem(i,j)+=mem(k,j)*x.mem(i,k);
						y.mem(i,j)%=1000000007;
					}
				}
			}
			return y;
		}
		operator*=(rect x) {
			set(height,x.width);
			for(int i=0; i<height; i++) {
				for(int j=0; j<x.width; j++) {
					for(int k=0; k<width; k++) {
						mem(i,j)+=mem(k,j)*x.mem(i,k);
						mem(i,j)%=1000000007;
					}
				}
			}
		}
		operator=(rect x) {
			set(x.width,x.height);
			for(int i=0; i<height; i++) {
				for(int j=0; j<width; j++) {
					mem(i,j)=x.mem(i,j);
				}
			}
		}
};
rect fastpow(rect r,long long n){
	rect x=r;
	rect p;
	p.set(2,2);
	p.mem(1,1)=1;
	p.mem(2,1)=0;
	p.mem(1,2)=0;
	p.mem(2,2)=1;
	while(n!=0){
		if(n%2==1){
			p=p*x;
		}
		x=x*x;
		n/=2;
	}
	return p;
}
long long n=1;
int main() {
	cin>>n;
	rect r;
	r.set(2,2);
	r.mem(1,1)=1;
	r.mem(2,1)=1;
	r.mem(1,2)=1;
	r.mem(2,2)=0;
	cout<<(fastpow(r,n).mem(1,2));
	return 0;
}
2023/10/29 19:23
加载中...