0pts求条
查看原帖
0pts求条
1209223
iris_hsd楼主2024/11/13 14:59
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5;
int n, p, k;
int fac[N], inv[N], fin[N];
int dp[N], st[N], l, r;

void init()
{
	fac[0] = 1;
	for(int i = 1;i <= k;i++) fac[i] = fac[i - 1] * i % p;
	inv[0] = 1;
	inv[1] = 1;
	for(int i = 2;i <= k;i++) inv[i] = (p - p / n) * inv[p % n] % p;
	fin[1] = 1;
	for(int i = 2;i <= k;i++) fin[i] = fin[i - 1] * inv[i] % p;
}

int lucas(int a, int b)
{
	if(a == b) return 1;
	if(a < b || b < 0) return 0;
	if(a <= p && b <= p) return fac[a] * fin[b] % p * fin[a - b] % p;
	else return lucas(a / p, b / p) * lucas(a % p, b % p);
}

void dfs(int cur)
{
    st[cur] = 1;
    if ((cur << 1) <= n)
        dfs(cur << 1);
    if ((cur << 1 | 1) <= n)
        dfs(cur << 1 | 1);
}

signed main()
{
	cin >> n >> p;
	k = min(n, p - 1);
	init();
	dp[0] = 1, dp[1] = 1;
	if(n > 2) dfs(2);
	for(int i = 2;i <= n;i++)
	{
		if(st[i]) l++;
		else r++;
		dp[i] = lucas(i - 1, l) * dp[l] % p * dp[r] % p;
	}
	cout<<dp[n]<<"\n";
	return 0;
}
2024/11/13 14:59
加载中...