80pts求助
查看原帖
80pts求助
84837
lqx_bnu楼主2024/1/17 17:49
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 1000000007
#define rep(i,a,n) for(register int i=a;i<=n;++i)
#define dwn(i,n,a) for(register int i=n;i>=a;--i)
using namespace std;
ll n,p[3][3],base[3][3],init[3],tmp[3][3],ans[3];
inline ll read()
{
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
void write(ll x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar('0'+x%10);
}
void mul()
{
	memset(tmp,0,sizeof(tmp));
	rep(i,1,2)
		rep(j,1,2)
			rep(k,1,2)tmp[i][j]=(tmp[i][j]+p[i][k]*base[k][j])%mod;
	rep(i,1,2)
		rep(j,1,2)p[i][j]=tmp[i][j];
	return;
}
void up()
{
	memset(tmp,0,sizeof(tmp));
	rep(i,1,2)
		rep(j,1,2)
			rep(k,1,2)tmp[i][j]=(tmp[i][j]+base[i][k]*base[k][j])%mod;
	rep(i,1,2)
		rep(j,1,2)base[i][j]=tmp[i][j];
	return;
}
int main()
{
	n=read();
	if(n==1||n==2)
	{
		putchar('1');
		return 0;
	}
	n-=2;
	p[1][1]=p[2][2]=1;
	init[1]=init[2]=1;
	base[1][1]=base[1][2]=base[2][1]=1;
	while(n)
	{
		if(n&1)mul();
		n>>=1;
		up();
	}
	rep(i,1,2)ans[1]=(ans[1]+init[i]*p[i][1])%mod;
	write(ans[1]);
	return 0;
}

2024/1/17 17:49
加载中...