[题解]P3200 [HNOI2009] 有趣的数列
给出另一种转化思路,模拟赛的时候想到的。
将我们构造的序列看作 \(n\) 个点 \((a_1,a_2),(a_3,a_4),\dots,(a_{2n-1},a_{2n})\)。
题目的限制条件转化为:
- \(a_i\) 构成 \(1,2,\dots,2n\) 的一个排列。
- 点 \(i\) 在 点 \(i-1\)的右上方。
- 所有点在直线 \(y=x\) 上方。

我们从这些点出发,作平行于 \(x,y\) 轴的直线,与图中的青色线段各交于一点。
条件 \(1\) 转化为这些点恰好覆盖整个青色线段上的 \(2n\) 个点。
条件 \(2\) 转化为青色线段上的同色区间没有嵌套关系。也就是说如果将这些区间按左端点排序,那么右端点构成的序列是单增的。
抛去网格,我们相当于为青色线段上的 \(2n\) 个点染 \(n\) 种颜色,每种颜色恰染 \(2\) 个点。
为了满足条件 \(2\),我们仅需对 \(n\) 个左端点染色。这是因为根据上面的分析,剩下 \(n\) 个空位作为右端点,其颜色是确定的。
为了使区间合法,我们需要使得任意长度为 \(i\) 的前缀,左端点数量 $\ge $右端点数量。
这样就完成了转化,所求答案即为第 \(n\) 个 Catalan 数。
回顾求 Catalan 数的方法。
\(\large f_n=\sum\limits_{i=0}^{n-1} f_i f_{n-i-1}\)。必须 \(O(n^2)\) 递推,遂放弃。
\(\large f_n=\frac{4n-2}{n+1} f_{n-1}\)。\(p\) 与 \(n+1\) 未必互质,无法求逆元;分式也未必是整数,不能化简,遂放弃。
\(\large f_n=\frac{C_{2n}^n}{n+1}=\frac{\prod\limits_{i=n+2}^{2n} i}{\prod\limits_{i=1}^n i}\)。由于该分式的值一定是整数,我们就可以对每个 \(i\) 进行质因数分解,从而达到约分的效果。
具体来说,我们仅需在欧拉筛的过程中记录 \(i\) 的最小质因数 \(mn_i\)。从大到小遍历每一个 \(i\),并将 \(i\) 的指数分配给 \(mn_i\) 和 \(\frac{i}{mn_i}\)。直到只有质数剩余为止。
时间复杂度 \(O(n\log n)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,mod,a[2*N],mn[2*N],p[N],idx,ans=1;
int qp(int a,int n){
int f=1;
while(n){
if(n&1) f=f*a%mod;
a=a*a%mod,n>>=1;
}
return f;
}
void init(int n){
for(int i=2;i<=n;i++){
if(!mn[i]) p[++idx]=mn[i]=i;
for(int j=1;j<=idx&&p[j]*i<=n;j++){
mn[i*p[j]]=p[j];
if(i%p[j]==0) break;
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>mod;
init(2*n);
for(int i=1;i<=n;i++) a[i]=-1;
for(int i=n+2;i<=2*n;i++) a[i]=1;
for(int i=2*n;i>1;i--) if(mn[i]!=i) a[mn[i]]+=a[i],a[i/mn[i]]+=a[i];
for(int i=2;i<=2*n;i++) if(mn[i]==i) ans=ans*qp(i,a[i])%mod;
cout<<ans<<"\n";
return 0;
}
[题解]P3200 [HNOI2009] 有趣的数列的更多相关文章
- 洛谷P3200 [HNOI2009]有趣的数列(Catalan数)
P3200 [HNOI2009]有趣的数列 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足 ...
- P3200 [HNOI2009]有趣的数列--洛谷luogu
---恢复内容开始--- 题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3& ...
- P3200 [HNOI2009]有趣的数列
题目描述 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<...<a2n ...
- 【题解】洛谷P3200 [HNOI2009] 有趣的数列(卡特兰数+质因数分解)
洛谷P3200:https://www.luogu.org/problemnew/show/P3200 思路 这题明显是卡特兰数的题型咯 一看精度有点大 如果递推卡特兰数公式要到O(n2) 可以证明得 ...
- Luogu P3200 [HNOI2009]有趣的数列
题意 给定 \(n\),求有多少个长度为 \(2n\) 的排列 \(p\) 满足 对于 \(1\leq i\leq n\),\(p_{2i-1}<p_{2i}\). \(p_1<p_3&l ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
[BZOJ1485][HNOI2009]有趣的数列(组合数学) 题面 BZOJ 洛谷 题解 从小往大填数,要么填在最小的奇数位置,要么填在最小的偶数位置. 偶数位置填的数的个数不能超过奇数位置填的数的 ...
- [HNOI2009]有趣的数列 卡特兰数
题面:[HNOI2009]有趣的数列 题解: 观察到题目其实就是要求从长为2n的序列中选n个放在集合a,剩下的放在集合b,使得集合a和集合b中可以一一对应的使a中的元素小于b. 2种想法(实质上是一样 ...
- 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)
「BZOJ1485」[HNOI2009] 有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
随机推荐
- CentOS-7 通过 NFS 实现服务器之间的文件(目录)共享
1.概述 NFS(Network File System):是在 UNIX(Linux)系统中最流行的网络文件系统,其功能是通过网络让不同的机器(或操作系统)可以共享彼此的文件或目录. 2.相关依赖组 ...
- JWT令牌如何在FastAPI中实现安全又高效的生成与验证?
title: JWT令牌如何在FastAPI中实现安全又高效的生成与验证? date: 2025/06/10 09:02:35 updated: 2025/06/10 09:02:35 author: ...
- 如何从Docker image提取 Dockerfile
参考链接:https://github.com/cucker0/dockerimage2df 参考链接:https://github.com/cucker0/docker/blob/main/md/由 ...
- php 读取文件,批量构造sql语句写入数据库
需求读取文件,构造sql,批量写入数据库,批量是构建设置 $num 值的大小进行批量构建sql语句 test.txt 文件内容为 1 2 3 4 5 6 7 8 9 10 <?php class ...
- Tauri2.0-DeepSeek电脑端Ai对话|tauri2+vite6+deepseek流式ai聊天系统
重磅新作tauri2.0+vue3.5+deepseek+arco桌面客户端ai流式输出聊天对话系统. tauri2-vue3-deepseek:桌面端ai聊天对话,基于Tauri2.x+Vite6集 ...
- Lustre 与 JuiceFS :架构设计、文件分布与特性比较
在 AI 模型训练.高性能计算等对 I/O 敏感的场景中,底层文件系统的架构和性能将直接影响训练效率.资源利用率与整体成本. Lustre 作为传统高性能文件系统,以极致性能著称:而 JuiceFS ...
- HyperWorks批处理网格的类型设置
网格类型设置(Configuration Tab) HyperWorks中BatchMesher 的 Configuration Tab 向用户提供了网格方案类型(Mesh Type)的选择.一个典型 ...
- 证明:C++ std::shared_ptr的引用不会增加它的计数值
#include <thread> #include <memory> #include <Windows.h> int main() { std::thread ...
- 全球人口数量、共享单车GPS轨迹、地铁上下客流数据获取平台分享
本文对目前主要的人口数量与密度.共享单车GPS轨迹.地铁人流与轨迹等数据产品的获取网站加以整理与介绍. 目录 7 人口.共享单车与地铁数据 7.1 人口数据 7.1.1 WorldPop 7.1. ...
- Counting Principles计数原理•Arrangement排列•Combination组合•Binomial Theorem二项式定理
Sampling K objects out of N : Does the K samples have order? is the object replaceable? Labeling: la ...