P1962斐波那契数列求调
  • 板块灌水区
  • 楼主lcy0506
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/5 15:24
  • 上次更新2024/8/5 16:11:49
查看原帖
P1962斐波那契数列求调
1044302
lcy0506楼主2024/8/5 15:24

WAWA与TLETLE的结合体

#include <bits/stdc++.h>
using namespace std;
struct node
{
	long long m[11][11];
};
node f,res;
long long n;
void init()
{
	f.m[1][1]=f.m[1][2]=f.m[2][1]=1;
	f.m[2][2]=0;
}
void square(node &x)
{
	for(int i=1;i<=2;i++)
	{
		for(int j=1;j<=2;j++)
		{
			if(i==j)
			x.m[i][j]=1ll;
			else
			x.m[i][j]=0ll;
		}
	}
}
void cf(node &x,node &y,node &z)
{
	memset(z.m,0,sizeof(z.m));
	for(int i=1;i<=2;i++)
	{
		for(int j=1;j<=2;j++)
		{
			if(x.m[i][j])
			{
				for(int k=1;k<=2;k++)
				{
					z.m[i][k]+=x.m[i][j]*y.m[j][k];
					z.m[i][k]%=1000000007;			
				}
			}
		}
	}
}
void quick(int k)
{
	square(res);
	node tmp=f,t;
	while(k)
	{
		if(k&1)
		{
			cf(res,tmp,t);
			res=t;
		}
		cf(tmp,tmp,t);
		tmp=t;
		k>>=1;
	}
}
long long solve()
{
	if(n<=2)
	return 1ll;
	quick(n-2);
	long long res1=res.m[1][1]+res.m[2][1];
	res1%=1000000007;
	return res1;
}
int main()
{
	cin>>n;
	init();
	cout<<solve();
	return 0;
}
2024/8/5 15:24
加载中...