WELCOME

任何一个伟大的目标,都有一个微不足道的开始。

[HNOI2009]【一本通提高组合数学】有趣的数列

[HNOI2009]有趣的数列

题目描述

我们称一个长度为 2 n 2n 2n 的数列是有趣的,当且仅当该数列满足以下三个条件:

  • 它是从 1 ∼ 2 n 1 \sim 2n 12n 2 n 2n 2n 个整数的一个排列 { a n } n = 1 2 n \{a_n\}_{n=1}^{2n} {an}n=12n

  • 所有的奇数项满足 a 1 < a 3 < ⋯ < a 2 n − 1 a_1<a_3< \dots < a_{2n-1} a1<a3<<a2n1,所有的偶数项满足 a 2 < a 4 < ⋯ < a 2 n a_2<a_4< \dots <a_{2n} a2<a4<<a2n

  • 任意相邻的两项 a 2 i − 1 a_{2i-1} a2i1 a 2 i a_{2i} a2i 满足: a 2 i − 1 < a 2 i a_{2i-1}<a_{2i} a2i1<a2i

对于给定的 n n n,请求出有多少个不同的长度为 2 n 2n 2n 的有趣的数列。
因为最后的答案可能很大,所以只要求输出答案对 p p p 取模。

输入格式

一行两个正整数 n , p n,p n,p

输出格式

输出一行一个整数表示答案。

输入输出样例

样例输入1

3 10

样例输出1

5

说明/提示

【数据范围】
对于 50 % 50\% 50% 的数据, 1 ≤ n ≤ 1000 1\le n \le 1000 1n1000
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 6 1\le n \le 10^6 1n106 1 ≤ p ≤ 1 0 9 1\le p \le 10^9 1p109

【样例解释】
对应的5个有趣的数列分别为(1,2,3,4,5,6),(1,2,3,5,4,6),(1,3,2,4,5,6),(1,3,2,5,4,6),(1,4,2,5,3,6)。

Code

#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL n, p, ans = 1, k;
int vis[2000005];

LL qmi(LL a, LL b, LL p)
{
	LL res = 1;
	while (b)
	{
		if (b & 1)
			res = res * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return res;
}

void c(LL x, LL p, LL f)
{
	while (x)
		k += f * x / p, x /= p;
}

int main()
{
	cin >> n >> p;
	for (LL i(2); i <= 2 * n; ++i)
	{
		if (vis[i])
			continue;
		k = 0;
		c(2 * n, i, 1);
		c(n + 1, i, -1);
		c(n, i, -1);
		ans = ans * qmi(i, k, p) % p;
		for (LL j(2 * i); j <= 2 * n; j += i)
			vis[j] = 1;
	}
	cout << ans;
	return 0;
}

广告

绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/

绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/

(现在使用,人人均可获得300元大奖)

posted @ 2022-07-12 20:35  绿树公司  阅读(84)  评论(0)    收藏  举报