萌新求助
查看原帖
萌新求助
546558
Land_ER楼主2021/12/4 16:11

80pts #2#10wa

#include<cstdio>
#define ll_ long long
#define mod_ 1000000007
struct matrix{
	ll_ f[3][3];
	int x,y;
	matrix(int a,int b){
		int i,j;
		x = a;
		y = b;
		for(i = 0;i <= x;++ i)
			for(j = 0;j <= y;++ j)
				f[i][j] = 0;
		return;
	}
};
matrix identity_matrix(int size){
	matrix a(size,size);
	int i;
	for(i = 1;i <= size;++ i)
		a.f[i][i] = 1;
	return a;
}
matrix operator*(const matrix& a,const matrix& b){
	matrix ret(a.y,b.x);
	int i,j,k;
	for(i = 1;i <= a.y;++ i)
		for(j = 1;j <= b.x;++ j)
			for(k = 1;k <= a.x;++ k)
				ret.f[i][j] = (ret.f[i][j] + a.f[k][i]*b.f[j][k]%mod_) % mod_;
	return ret;
}
matrix qpow(matrix a,int n){
	matrix ret = identity_matrix(a.x);
	matrix base = a;
	while(n > 0){
		if(n & 1)
			ret = ret * base;
		base = base * base;
		n >>= 1;
	}
	return ret;
}
void solve(void){
	int n;
	matrix fibo(2,1),m(2,2);
	fibo.f[1][1] = 1;fibo.f[2][1] = 1;
	m.f[1][1] = 1;m.f[2][1] = 1;m.f[1][2] = 1;
	scanf("%d",&n);
	m = qpow(m,n-2);
	fibo = fibo * m;
	printf("%lld",fibo.f[1][1]);
	return;
}
int main(void){
	solve();
	return 0;
}}
2021/12/4 16:11
加载中...