2026/5/18 15:36:29
网站建设
项目流程
做英文网站费用,福州高端网站建设公司,wordpress 8.0,内部链接网站大全题目描述我们称一个长度为 2n 的数列是有趣的#xff0c;当且仅当该数列满足以下三个条件#xff1a;它是从 1∼2n 共 2n 个整数的一个排列 {an}n12n#xff1b;所有的奇数项满足 a1a3⋯a2n−1#xff0c;所有的偶数项满足 a2a4⋯a2…题目描述我们称一个长度为 2n 的数列是有趣的当且仅当该数列满足以下三个条件它是从 1∼2n 共 2n 个整数的一个排列 {an}n12n所有的奇数项满足 a1a3⋯a2n−1所有的偶数项满足 a2a4⋯a2n任意相邻的两项 a2i−1 与 a2i 满足a2i−1a2i。对于给定的 n请求出有多少个不同的长度为 2n 的有趣的数列。因为最后的答案可能很大所以只要求输出答案对 p 取模。输入格式一行两个正整数 n,p。输出格式输出一行一个整数表示答案。输入输出样例输入 #1复制3 10输出 #1复制5说明/提示【数据范围】对于 50% 的数据1≤n≤1000对于 100% 的数据1≤n≤1061≤p≤109。【样例解释】对应的 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)。代码实现#include cstdio using namespace std; const int N 2e6 5; int v[N], pr[N], c 0; // 补充快速读入函数 inline int read() { int x 0; char c getchar(); while (c 0 || c 9) c getchar(); while (c 0 c 9) x x * 10 c - 0, c getchar(); return x; } // 补充快速输出函数 inline void writeln(int x) { if (x 0) { putchar(0); putchar(\n); return; } char s[10]; int len 0; while (x) s[len] x % 10 0, x / 10; for (int i len - 1; i 0; i--) putchar(s[i]); putchar(\n); } inline void sieve(int n) { v[1] 0; for (int i 2; i n; i) { if (!v[i]) pr[c] i, v[i] i; for (int j 1; j c pr[j] * i n; j) { v[pr[j] * i] pr[j]; if (i % pr[j] 0) break; } } } inline int qp(int a, int b, int mod) { int res 1; for (; b; b 1, a 1ll * a * a % mod) if (b 1) res 1ll * res * a % mod; return res; } inline int cnt_p(int n, int p) { int res 0; while (n) { res n / p; n / p; } return res; } int n, r[N], p, ans 1; signed main(void) { n read(), p read(); sieve(2 * n); for (int i 1; i c; i) r[i] cnt_p(2 * n, pr[i]) - cnt_p(n, pr[i]) - cnt_p(n 1, pr[i]); for (int i 1; i c; i) ans 1ll * ans * qp(pr[i], r[i], p) % p; writeln(ans); return 0; }