Perm 排列计数——Lucas&dfs

思路:这道题给出的公式看明白后即可得出正解,我们可以把他想象成一颗二叉树,任意一个点的任意一个子孙一直除以2后最终都会到达一终点,终点则为以该点为根的子树的最小值。
so——我们可以将根节点作为最后终点即最小值1,设有n个点,左子树选m个点,剩下的给右子树,左子树组合数即C(n-1,m),and就可以得出转移式为f[father]=f[lson]*f[rson]*C(size[x]-1,size[2*x]) f表示满足条件的组合数,size表示以该点为根的树的大小
求大组合数再用Lucas定理就可以了
直接A了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Damn:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=10000010;
int n,mod;
int ans[N],size[N];
int read(){
int ans=0;bool f=0;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')f=1;ch=getchar();}
while(ch>='0' && ch<='9'){ans=(ans<<1)+(ans<<3)+(48^ch);ch=getchar();}
return f?-ans:ans;
}
int quickmi(int a,int k){
int ans=1;
while(k){
if(k&1) ans=ans*a%mod;
k>>=1;
a=a*a%mod;
}
return ans;
}
int C(int x,int y){
if(x<y) return 0;
return ans[x]*quickmi(ans[y],mod-2)%mod*quickmi(ans[x-y],mod-2)%mod;
}
int lucas(int a,int b){
if(a<mod&&b<mod) return C(a,b);
return C(a%mod,b%mod)*lucas(a/mod,b/mod)%mod;
}
int dfs(int x){
if(x>n)return 1;
int lson=dfs(x*2),rson=dfs(x*2+1);
size[x]=size[x*2]+size[x*2+1]+1;
return ((lson*rson)%mod)*lucas(size[x]-1,size[x*2])%mod;
}
signed main(){
n=read(),mod=read();
ans[0]=ans[1]=1;
for(int i=2;i<=n;i++) ans[i]=ans[i-1]*i%mod;
printf("%lld",dfs(1));
return 0;
}
#一名爱打篮球的oier#
Perm 排列计数——Lucas&dfs的更多相关文章
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas
题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...
- Perm排列计数(新博客试水,写的不好,各路大神见谅)
B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...
- 2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...
- BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...
- bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2111 [题意] 给定n,问1..n的排列中有多少个可以构成小根堆. [思路] 设f[i ...
- 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Mogic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Mogic的,答案可能很 ...
随机推荐
- RPA是啥?是干嘛的?如何入门开始使用?(一)
1.RPA是啥? 我们先对RPA有一个大概的了解,再循序渐进. Robotic Process Automation(机器人流程自动化,简称RPA). 我的简单理解就是自动化,类似于按键精灵,相对来说 ...
- C++ STL 容器-array类型
C++ STL 容器-array类型 array是C++11STL封装的数组,内存分配在栈中stack,绝对不会重新分配,随机访问 创建和初始化 // 下面的等同于int a[10]; std::ar ...
- Codeforces Round 926 (Div. 2)(A~D)
目录 A B C D A 输出最大值减最小值,或者排序算一下答案 #include <bits/stdc++.h> #define int long long #define rep(i, ...
- Android系统瘦身
文件格式: Windows常见的文件系统是FAT16.FAT32,NTFS,在Windows环境提供了分区格式转换工具,可以在DOC环境下 使用 Convert命令(Convert e:/fs:nt ...
- C++中OpenCV、Armadillo矩阵数据格式的转换方式
本文介绍在C++语言中,矩阵库Armadillo的mat.vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法. 在C++语言的矩阵库Armadillo与计算机视觉库Open ...
- Zabbix“专家坐诊”第179期问答汇总
欢迎大家加入乐维社区zabbix问答专栏,除了在论坛发帖求问外,还可以在QQ群里交流进步,并且每周三我们会进行免费的技术答疑活动. 问题一: Q:Zabbix alert syncer process ...
- 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 - ahk 脚本 - autoHotKey
为什么 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 切换网页的时候,回来还是搜索输入法,就想到按esc,直接强制英文输入法 之前vim插件里面 用了一个 im-selec ...
- Idea编译/运行Java程序慢
修改前: 修改后: 参考: https://www.jjput.com/archives/macbookpro14m1mavenslowcompilation 问题 JDK尽量不要换版本 class ...
- Kotlin 快速遍历File及子目录筛选指定类型文件
原文: Kotlin 快速遍历File及子目录筛选指定类型文件 - Stars-One的杂货小窝 在做文件相关的app,经常会遇到筛选某个文件夹下的符合条件的文件对象,且要包含子文件夹,之前一直是自己 ...
- 瑞云科技联合飞蝶VR教育、大朋VR推出元宇宙 5G VR智慧教育整体解决方案
近日,瑞云科技3DCAT实时渲染云与飞蝶VR.大朋VR达成深度合作.基于瑞云深度自研的实时渲染云技术.飞蝶VR教育内容资源的深厚积累以及大朋VR优秀的VR硬件产品力,三方针对元宇宙 5G VR智慧教育 ...