首页 > 其他分享 >Perm 排列计数——Lucas&dfs

Perm 排列计数——Lucas&dfs

时间:2024-04-13 19:34:54浏览次数:16  
标签:ch Lucas int Perm dfs ans mod size

思路:这道题给出的公式看明白后即可得出正解,我们可以把他想象成一颗二叉树,任意一个点的任意一个子孙一直除以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#

标签:ch,Lucas,int,Perm,dfs,ans,mod,size
From: https://www.cnblogs.com/hzoiwzs/p/18133249

相关文章

  • DFS
    DFSDFS指数型枚举模板#include<iostream>usingnamespacestd;intarr[20];intn;voiddfs(intx){if(x>n){//出口DFS位置大于选择的nfor(inti=1;i<=n;++i){if(arr[i]==1){//如果标志为1的被选中的打印出......
  • dfs序专题训练
    DFS序专题NC13611https://ac.nowcoder.com/acm/problem/13611题意:要求树上任意两点相同颜色之间的路径上的点也是相同颜色,k种颜色,求方案数Solution:原问题等价于将树分割成若干连通块且相互之间颜色不同其实是道数论题。题意可以转化为将树分割为不超过\(k\)个连通块,每个连......
  • P9669 [ICPC2022 Jinan R] DFS Order 2
    P9669[ICPC2022JinanR]DFSOrder2树形dp+回退背包dfs的过程时走到\(u\),如果走进一个子树后要回到\(u\),那么这个子树一定全部遍历了一遍。所以方案数会跟子树遍历的方案数有关,可以预处理。设\(h_u\)表示\(u\)子树的遍历方案,假如\(u\)有\(m\)个儿子,那么有\(h_u=......
  • 买瓜-dfs
    6.买瓜-蓝桥云课(lanqiao.cn)#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;intn,m,a[35],cnt=40,sum[35];//x是当前编号,w是当前总重量,c是当前劈了多少个瓜voiddfs(intx,intw,intc){ if(w==m){//如果当前重量符合要......
  • Acwing2024蓝桥杯DFS
    模板:AcWing826.单链表利用数组创建单链表:#include<iostream>usingnamespacestd;constintN=100005;inthead,value[N],nextt[N],id;voidInit(){head=-1,id=0;}voidHead_Insert_x(intx){value[id]=x;nextt[id]=head;head=id++;}voidD......
  • 拓展卢卡斯定理 / exlucas
    恶心东西爬、、、我们要求解一个\(\binom{n}{m}\modM\),\(M\)是不太大的正整数,\(n,m\)是可能比较大的正整数。首先我们分解\(M=\prod_{i=1}^kp_i^{x_i}\),我们对于每一个\(i\in[1,k]\)求出\(\binom{n}{m}\modp_i^{x_i}\),然后就会组成一个方程组,\(Ans\equiv\binom{n}{m}\p......
  • HDFS报错:Couldn‘t preview the file.
    packagecom.qm.hdfs;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.junit.After;importorg.junit.Before;importorg.junit.Test;importjava.io.IOException;importjava.n......
  • [CF1718D] Permutation for Burenka 瞎扯
    尝试回到1,2月份的文风。感觉,自己思考的时候最好不要乱走,模拟一下考场上的氛围和紧张感,让自己保持专注。但是当你已经了解了这个问题的全貌后,随机游走一会,仔细观察问题,梳理思路,感觉收获会比较大。所以看起来我不擅长自己想题,比较擅长马后炮。[CF1718D]PermutationforBur......
  • Java实现Fast DFS、服务器、OSS上传
    支持FastDFS、服务器、OSS等上传方式介绍在实际的业务中,可以根据客户的需求设置不同的文件上传需求,支持普通服务器上传+分布式上传(FastDFS)+云服务上传OSS(OSS)软件架构为了方便演示使用,本项目使用的是前后端不分离的架构前端:Jquery.uploadFile后端:SpringBoot前期准备:F......
  • Acwing 681. 疏散人群(dfs)(记录根节点下有几个子节点)
    输入样例:62132435261输出样例:4#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLN=100200,M=2020;constLLmod=998244353;vector<LL>g[N];LLsum[N];LLdfs(LLidx,LLfa){LL......