12分求助qwq
查看原帖
12分求助qwq
1272113
StupidBirdsb楼主2024/5/15 18:20
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2;
int n,p;
ll m;
struct sqare{
	ll sq[N + 2][N + 2];
}f,ans;
void dj(sqare&x)
{
	for(int i =1;i <=N;i++)
	{
		for(int j = 1;j <=N;j++)
		{
			if(i ==j)
			{
				x.sq[i][j] = 1LL;
			}
				else
				{
					x.sq[i][j] = 0LL;
				}
			}
		}
}
void jc(sqare&x,sqare&y,sqare&z)
{
	memset(z.sq,0,sizeof(z.sq));
	for(int i =1;i <=N;i++)
	{
		for(int j = 1;j <=N;j++)
		{
			if(x.sq[i][j])
			{
				for(int k = 1; k <= N;k++)
				{
					z.sq[i][k] += x.sq[i][j]*y.sq[j][k];
				if(z.sq[i][k] >= m)
				{
					z.sq[i][k] %=m;
				}
				}
				
			}
		}
	}
}
void qp(int k)
{
	dj(ans);
	sqare tmp = f,t;
	while(k)
	{
		if(k%2==1)
		{
			jc(ans,tmp,t);
			ans = t;
		}
		jc(tmp,tmp,t);
		tmp = t;
		k /= 2;
	}
}
ll slove()
{
	if(n <= 2)
	{
		return 1LL;
	}
	qp(n - 2);
	ll ret = ans.sq[1][1] + ans.sq[2][1];
	if(ret >= m)
	{
		ret -=m;
	} 
	return ret;
}
int main()
{
	cin >> n >> p;
	m = p;
	f.sq[1][1] = 1;
	f.sq[1][2] = 1;
	f.sq[2][1] = 1;
	f.sq[2][2] = 0;
	int ans2 = (int)slove();
	cout << ans2;
	return 0;
}

2024/5/15 18:20
加载中...