大佬求调快速幂(60pts,像慢速幂)
查看原帖
大佬求调快速幂(60pts,像慢速幂)
774835
封禁用户楼主2024/1/21 19:11
#include<bits/stdc++.h>
using namespace std;
struct nof
{
	unsigned long long data[3][3];
};
unsigned long long F[3][2];
unsigned long long T[3][3];
unsigned long long Multiplication_first(unsigned long long A[3][3] , unsigned long long B[3][2])
{
	return (A[1][1] * B[1][1] + A[1][2] * B[2][1]) % 1000000007;
}
nof P(unsigned long long A[3][3] , unsigned long long B[3][3])
{
	nof C;
	for(int i = 1;i <= 2;++ i)
	for(int j = 1;j <= 2;++ j)
	C.data[i][j] = 0;
	for(int i = 1;i <= 2;++ i)
	{
		for(int k = 1;k <= 2;++ k)
	    {
	    	unsigned long long t = A[i][k];
	    	for(int j = 1;j <= 2;++ j)
	    	{
	    		C.data[i][j] = (C.data[i][j] + t * B[k][j]) % 1000000007;
			}
		}
	}
	return C;
}
nof mod(nof A)
{
	for(int i = 1;i <= 2;++ i)
	{
		for(int j = 1;j <= 2;++ j)
		{
			A.data[i][j] %= 1000000007;
		}
	}
	return A;
}
nof l;
nof pow(unsigned long long A[3][3] , unsigned long long p)
{

	for(int i = 1;i <= 2;++ i)
	for(int j = 1;j <= 2;++ j)
	l.data[i][j] = A[i][j];
	if(p == 1)
	return l;
	if(p % 2)
	return mod(P(mod(P(mod(pow(A , p / 2)).data , mod(pow(A , p / 2)).data)).data , A));
	return mod(P(mod(pow(A , p / 2)).data , mod(pow(A , p / 2)).data));
}
int main()
{
	unsigned long long n;
	cin >> n; 
	F[1][1] = 1;
	F[2][1] = 1;
	T[1][1] = 1;
	T[1][2] = 1;
	T[2][1] = 1;
	T[2][2] = 0;
	if(n == 1 || n == 2)
	{
		cout << 1;
		return 0;
	}
	printf("%lld" , Multiplication_first(mod(pow(T , n - 2)).data , F) % 1000000007);
	return 0;
}
2024/1/21 19:11
加载中...