当前位置: 首页 > news >正文

P2606 [ZJOI2010] 排列计数 分析

题目概述

题目链接:https://www.luogu.com.cn/problem/P2606。

称一个 \(1 \sim n\) 的排列 \(p_1,p_2, \dots ,p_n\) 是 Magic 的,当且仅当

\[\forall i \in [2,n],p_i > p_{\lfloor i/2 \rfloor} \]

计算 \(1 \sim n\) 的排列中有多少是 Magic 的,答案可能很大,只能输出模 \(m\) 以后的值。

对于 \(100\%\) 的数据,\(1\le n \le 10^6\), \(1\le m \le 10^9\)\(m\) 是一个质数。

分析1

这显然是一个小根堆,那么直接设 \(f_i\) 表示大小为 \(i\) 的排列(经典)满足小根堆性质的方案。

显然钦定第一个节点为 \(1\),然后就有:

\[f_{i}=\binom{i-1}{l}f_l\times f_r \]

其中 \(l\) 是这个完全二叉树左子树的大小。

分析2

巧法:考虑将计数问题转化为概率问题

我们可以求出满足这个条件的概率,最后在乘上总方案就行了,有时候概率题也可以用计数题的方法。

我们考虑一个大小为 \(k\) 的子树,那么显然我当前这个点满足小根堆的性质当且仅当为这里面的最小值,所以概率是 \(\frac{1}{k}\)

所以 \(n\) 个点满足的概率为 \(\frac{1}{\prod_i sz_i}\),那么所有的答案为 \(\frac{n!}{\prod_i sz_i}\)

代码

只有分析二的代码,分析一的我没有打(因为感觉分析二的方法更通用一点)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define int long long
#define N 2000006
using namespace std;
int n,mod;
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
int sz[N],inv[N],jc[N];
int ans = 1,fz,fm;
int qpow(int a,int b) {int res = 1;while(b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
void dfs(int cur) {sz[cur] = 1;if (ls(cur) <= n) dfs(ls(cur));if (rs(cur) <= n) dfs(rs(cur));sz[cur] += sz[ls(cur)] + sz[rs(cur)];int t = sz[cur];while(t % mod == 0) fm ++,t /= mod;ans = ans * inv[t % mod] % mod;
}
int f(int n,int m) {if (n / m <= 0) return 0;return n / m + f(n / m,m);
}
signed main(){cin >> n >> mod;jc[0] = jc[1] = inv[0] = inv[1] = 1;for (int i = 2;i <= n;i ++) jc[i] = jc[i - 1] * i % mod;for (int i = 2;i <= min(n,mod - 1);i ++) inv[i] = (mod - mod / i) * inv[mod % i] % mod;dfs(1);fz = f(n,mod);if (fz > fm) return cout << 0,0;else {for (int i = 1;i <= n;i ++) {int t = i;while (t % mod == 0) t /= mod;ans = ans * t % mod;}cout << ans;}return 0;
}
//7 3
http://www.gsyq.cn/news/29667.html

相关文章:

  • 实用指南:MacOS - Clang使用bits/stdc++.h - 非官方(竞赛用) - 通用方法
  • 设计模式:代码界的 “光之巨人” 养成指南(附 C++ 实战)
  • 详细介绍:17-Language Modeling with Gated Convolutional Networks
  • 算法分析--生成排列
  • 三大安全认证授权协议深度对比:OAuth、OpenID Connect与SAML
  • (简记)(自用)线段树区间拆分时间复杂度证明
  • SpringBoot整合缓存2-Redis
  • 10.24 CSP-S 模拟37 改题记录
  • NOI25D2T2
  • 数字人企业:数字人公司重点推荐与选择指南
  • 据说每邀请一位朋友加入Comet,您可以获得10刀乐奖励:D
  • 王炸!OpenAI 发布 Atlas 浏览器!!
  • 课后作业4
  • cn域名隐私保护
  • 【开题答辩全过程】以 M11289生鲜商城为例,具备答辩的问题和答案
  • Linux手动安装最新版 CMake
  • 2025年新疆喀纳斯旅游服务权威推荐榜单:新疆/阿勒泰/禾木深度游旅行社综合评测
  • 2025 OSCAR丨与创新者同频!Apache RocketMQ 邀您共赴开源之约
  • 2025年PSA制氮设备厂家权威推荐榜单:电解水制氢设备/氦气纯化系统/氘气回收纯化源头厂家精选
  • 解决git clone只有master分支的问题
  • 一文读懂循环神经网络(RNN):原理、局限与LSTM解决方案 - 指南
  • 2025年北京cppm认证培训公司权威推荐榜单:cppm考前培训/cppm证书培训/cppm课程培训源头公司精选
  • 0273-GRPC-tonic 进行编解码
  • 0271-GRPC-prost 带长度的编解码
  • 0270-GRPC-使用 prost 解码
  • 动手动脑4
  • python+request+unittest自动化测试
  • 2025 年保温涂料厂家最新推荐排行榜:聚焦技术专利与管理体系认证的优质品牌耐高温/防火耐热/防腐/纳米介孔微珠中空粒子保温涂料公司推荐
  • 2025年云南独立成团游公司权威推荐榜单:云南旅游团/云南私享之旅/云南专属行程游源头公司精选
  • 2025年5.5KW工业吸尘器厂家权威推荐榜单:380V防爆吸尘器/7.5KW工业吸尘器/水浴式吸尘器源头厂家精选