萌新第一个点T了。 。。。。。求捞
查看原帖
萌新第一个点T了。 。。。。。求捞
1036693
carp_oier楼主2023/8/21 08:30
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define rl register ll

const ll N = 3;
	
ll n, m = 1e9+7;

inline void mul(ll c[], ll a[], ll b[][N])
{
	ll temp[N] = {0, 0, 0};
	for(rl i=0 ;i < N; ++ i)
		for(rl j=0; j < N; ++ j)
		{
			temp[i] = (temp[i] + a[j] * b[j][i]) % m;
		}
		
	memcpy(c, temp, sizeof temp);
}

inline void mul(ll c[][N], ll a[][N], ll b[][N])
{
	ll temp[N][N] = {0};
	for(rl i=0; i < N; ++ i)
		for(rl j=0; j < N ; ++ j)
			for(rl k=0; k < N; ++ k)
				temp[i][j] = (temp[i][j] + a[i][k] * b[k][j]) % m;
	
	memcpy(c, temp, sizeof temp);
}

int main()
{
	scanf("%lld", &n);
	
	ll f1[N] = {1, 1, 1};
	
	ll a[N][N] = {
				{0, 1, 0},
				{1, 1, 1},
				{0, 0, 1}};
				
	n -= 2;
	
	while(n)
	{
		if(n & 1) mul(f1, f1, a);
		mul(a, a, a);
		n >>= 1;
	}
	
	printf("%lld\n", f1[1]);
	return 0; 
} 
2023/8/21 08:30
加载中...