斐波那契数大数求法(模板)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2,mod=1000000007 ;
 
struct Matrix
{
	ll mat[MAXN][MAXN];
	Matrix() {}
	Matrix operator*(Matrix const &b)const
	{
		Matrix res;
		memset(res.mat, 0, sizeof(res.mat));
		for (int i = 0 ;i < MAXN; i++)
		for (int j = 0; j < MAXN; j++)
		for (int k = 0; k < MAXN; k++)
			res.mat[i][j] = (res.mat[i][j]+this->mat[i][k] * b.mat[k][j])%mod;
		return res;
	}
};
Matrix pow_mod(Matrix base, int n)
{
	Matrix res;
	memset(res.mat, 0, sizeof(res.mat));
	for (int i = 0; i < MAXN; i++)
		res.mat[i][i] = 1;
	while (n > 0)
	{
		if (n & 1) res = res*base;
		base = base*base;
		n >>= 1;
	}
	return res;
}
Matrix base,fi;
int main()
{
 
	base.mat[0][0] = 1;
	base.mat[0][1] = 1; 
	base.mat[1][0] = 1;
	fi.mat[0][0]=1;
	fi.mat[1][0]=1;
	int n;
	while (~scanf("%d", &n)&&n)
	{
	    if(n<=2)
        {
            printf("%d\n",1);
            continue;
        }
		Matrix ans = pow_mod(base, n-2);
		ans=ans*fi;
		printf("%lld\n", ans.mat[0][0]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/89437065