[ZJOI2010]排列计数
题目描述
称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值
输入输出格式
输入格式:
输入文件的第一行包含两个整数 n和p,含义如上所述。
输出格式:
输出文件中仅包含一个整数,表示计算1,2,⋯, ���的排列中, Magic排列的个数模 p的值。
输入输出样例
20 23
16
说明
100%的数据中,1 ≤N ≤ 10^6, P≤ 10^9,p是一个质数。
画图发现树的形状是唯一的
且对于一个子树的根,一定小于所有子树节点
也就是说,对于一个根节点,只要考虑给左右子树划分的方案
可以列出dp方程:
f[i]=f[2*i]*f[2*i+1]*C(size[2*i],size[2*i+1]+size[2*i])
这题据说n会大于p,也就是说1~n会含有p
那么就不能线性求逆元
统计出i!中p出现的次数num[i]和不算p的倍数的阶乘fac[i]
算组合数时,如果num[y]-num[x]-num[y-x]不为0直接返回0
逆元直接把fac[]带入拓展欧几里德,因为在算fac时排除了p,所以可行
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long lol;
lol f[],size[],p,num[],fac[],n;
lol exgcd(lol a,lol b,lol &x,lol &y)
{
if (b==)
{
x=;y=;
return a;
}
lol d=exgcd(b,a%b,x,y);
lol t=x;x=y;y=t-(a/b)*y;
return d;
}
lol reverse(lol a)
{
lol x,y;
exgcd(a,p,x,y);
return (x%p+p)%p;
}
lol C(int x,int y)
{
lol ap=num[y],bp=num[x],cp=num[y-x];
if (ap-bp-cp) return ;
lol s=(fac[y]*reverse(fac[x])%p)*reverse(fac[y-x])%p;
return s;
}
void dfs_dp(int x)
{
f[x]=;
size[x]=;
if (*x<=n)
dfs_dp(*x);
if (*x+<=n)
dfs_dp(*x+);
if (*x<=n)
if (*x+>n||size[*x+]==)
{
f[x]=f[*x];
size[x]+=size[*x];
}
else
{
f[x]=((f[*x]*f[*x+]%p)*C(size[*x],size[*x]+size[*x+])%p)%p;
size[x]+=size[*x]+size[*x+];
}
}
int main()
{int i;
cin>>n>>p;
fac[]=;
for (i=;i<=n;i++)
{
int x=i;
num[i]=num[i-];
while (x%p==)
{
num[i]++;
x/=p;
}
if (i%p==) fac[i]=fac[i-];
else fac[i]=fac[i-]*i%p;
}
dfs_dp();
cout<<f[];
}
[ZJOI2010]排列计数的更多相关文章
- 【BZOJ2111】[ZJOI2010]排列计数(组合数学)
[BZOJ2111][ZJOI2010]排列计数(组合数学) 题面 BZOJ 洛谷 题解 就是今年九省联考\(D1T2\)的弱化版? 直接递归组合数算就好了. 注意一下模数可以小于\(n\),所以要存 ...
- [ZJOI2010]排列计数 (组合计数/dp)
[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- P2606 [ZJOI2010]排列计数
P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...
- 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)
题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案 ...
- ●洛谷P2606 [ZJOI2010]排列计数
题链: https://www.luogu.org/problemnew/show/P2606题解: 组合数(DP),Lucas定理 首先应该容易看出,这个排列其实是一个小顶堆. 然后我们可以考虑dp ...
- BZOJ2111:[ZJOI2010]排列计数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2111 https://www.luogu.org/problemnew/show/P2606#su ...
- bzoj2111 [ZJOI2010]排列计数
Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic ...
- 洛谷P2606 [ZJOI2010]排列计数
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...
随机推荐
- 关于python中的operator.itemgetter()函数的用法
1. operator.itemgetter(num)函数 表示对对象的第num维数据进行操作获取. >>>import operator >>>a = [1, 2 ...
- 结对编程作业——四则运算GUI程序
毛忠庆 201421122088 赵嘉楠 201421122065 源代码存放位置:https://gitee.com/ouwen0819/SiZeYunSuan.git 题目描述 使用 -n 参数控 ...
- 算法第四版学习笔记之快速排序 QuickSort
软件:DrJava 参考书:算法(第四版) 章节:2.3快速排序(以下截图是算法配套视频所讲内容截图) 1:快速排序 2:
- Android Notification setLatestEventInfo方法已废弃
代替setLatestEventInfo的方法是用Notification.Builder创建Builder对象,通过该对象设置Notification相关属性. otification.Builde ...
- 09-移动端开发教程-Sass入门
1. 引言 CSS3之前的CSS都大都是枚举属性样式,而编程语言强大的变量.函数.循环.分支等功能基本都不能在CSS中使用,让CSS的编程黯淡无光,Sass就是一种增强CSS编程的扩展语言(CSS4也 ...
- mint-ui在vue中的使用。
首先放上mint-ui中文文档 近来在使用mint-ui,发现部分插件在讲解上并不是很详细,部分实例找不到使用的代码.github上面的分享,里面都是markdown文件,内容就是网上的文档 刚好自己 ...
- egg.js 的优缺点
egg.js 的优缺点 优点 所有的 web开发的点都考虑到了 agent 很有特色 文件夹规划到位 扩展能力优秀 缺点 最大的问题在于: 使用 loader 加载之后,失去了代码提示的能力 监控和运 ...
- 算法题丨Two Sum
描述 Given an array of integers, return indices of the two numbers such that they add up to a specific ...
- Jenkins中展示HTML测试报告
背景:测试报告是用reportNG生成的,属于java自动化测试项目. 1) 安装插件 首先要安装HTML Publisher plugin,这个在插件管理里面搜索并安装即可,如下我已 ...
- Python内置函数(37)——sorted
英文文档: sorted(iterable[, key][, reverse]) Return a new sorted list from the items in iterable. Has tw ...