[uva11174]村民排队 递推+组合数+线性求逆元
n(n<=40000)个村民排成一列,每个人不能排在自己父亲的前面,有些人的父亲不一定在。问有多少种方案。
父子关系组成一个森林,加一个虚拟根rt,转化成一棵树。
假设f[i]表示以i为根的子树的排列方案数。
f[i]=f[1]*f[2]*..f[k] /(sum[i]-1)!/sum[1]!*sum[2]!*..sum[k]!)
化简,对每一个i,sum[i]-1在分子出现一次,sum[i]在分母出现一次。
Ans = n!/(sum1*sum2*sum3*...*sumn)
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 typedef long long LL; 8 const int mod=((int)1e9)+7,maxn=40000,N=40010; 9 int first[N],sum[N],fa[N]; 10 LL jc[N],inv[N]; 11 int rt,al; 12 struct node{int x,y,next;}a[N]; 13 14 void ins(int x,int y) 15 { 16 a[++al].x=x;a[al].y=y; 17 a[al].next=first[x];first[x]=al; 18 } 19 20 void dfs(int x) 21 { 22 sum[x]++; 23 for(int i=first[x];i;i=a[i].next) 24 { 25 dfs(a[i].y); 26 sum[x]+=sum[a[i].y]; 27 } 28 } 29 30 int main() 31 { 32 freopen("a.in","r",stdin); 33 34 jc[1]=1; 35 for(int i=2;i<=maxn;i++) jc[i]=(jc[i-1]*i)%mod; 36 inv[1]=1; 37 for(int i=2;i<=maxn;i++) 38 { 39 inv[i]=((LL)(mod-mod/i))*inv[mod%i]%mod; 40 } 41 42 int T,n,m,x,y; 43 scanf("%d",&T); 44 while(T--) 45 { 46 scanf("%d%d",&n,&m); 47 rt=n+1; 48 for(int i=1;i<=n;i++) fa[i]=-1; 49 al=0; 50 memset(first,0,sizeof(first)); 51 for(int i=1;i<=m;i++) 52 { 53 scanf("%d%d",&x,&y); 54 fa[x]=y; 55 ins(y,x); 56 } 57 for(int i=1;i<=n;i++) 58 if(fa[i]==-1) fa[i]=rt,ins(rt,i); 59 memset(sum,0,sizeof(sum)); 60 dfs(rt); 61 LL ans=jc[sum[rt]-1]; 62 for(int i=1;i<=n;i++) 63 { 64 ans=ans*inv[sum[i]]%mod; 65 } 66 printf("%lld\n",ans); 67 } 68 69 return 0; 70 }
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;
typedef long long LL;const int mod=((int)1e9)+7,maxn=40000,N=40010;int first[N],sum[N],fa[N];LL jc[N],inv[N];int rt,al;struct node{int x,y,next;}a[N];
void ins(int x,int y){a[++al].x=x;a[al].y=y;a[al].next=first[x];first[x]=al;}
void dfs(int x){sum[x]++;for(int i=first[x];i;i=a[i].next){dfs(a[i].y);sum[x]+=sum[a[i].y];}}
int main(){freopen("a.in","r",stdin);jc[1]=1;for(int i=2;i<=maxn;i++) jc[i]=(jc[i-1]*i)%mod;inv[1]=1;for(int i=2;i<=maxn;i++){inv[i]=((LL)(mod-mod/i))*inv[mod%i]%mod;}int T,n,m,x,y;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);rt=n+1;for(int i=1;i<=n;i++) fa[i]=-1;al=0;memset(first,0,sizeof(first));for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);fa[x]=y;ins(y,x);}for(int i=1;i<=n;i++)if(fa[i]==-1) fa[i]=rt,ins(rt,i);memset(sum,0,sizeof(sum));dfs(rt);LL ans=jc[sum[rt]-1];for(int i=1;i<=n;i++){ans=ans*inv[sum[i]]%mod;}printf("%lld\n",ans);}return 0;}
转载于:https://www.cnblogs.com/KonjakJuruo/p/9688582.html
[uva11174]村民排队 递推+组合数+线性求逆元相关推荐
- 【训练题22:线性求逆元】【模板】乘法逆元 | 洛谷 P3811
[模板]乘法逆元 难度 普及/提高\color{yellow}普及/提高普及/提高 板子题,给出两种方法 题意 给 n,pn,pn,p 求出所有 i∈[1,n]i\in[1,n]i∈[1,n]在模 p ...
- 取模除法(逆元)(费马小定理)(线性求逆元)
文章目录 引言 逆元 费马小定理 内容 应用 证明 线性求逆元 thanks for reading! 引言 我们做题时经常会由于答案过大,被要求使答案对一个质数取模 我们都知道,加和乘对取模是没有影 ...
- 求逆元(线性求逆元)及其扩展欧几里得
线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...
- P5081 Tweetuzki爱取球(期望)(线性求逆元)
文章目录 题目描述 解析 代码 题目描述 解析 首先有一个很重要的引理: 若一件事做成的概率是p,则其做成需要次数的期望是1/p 为什么呢? 我们设做成这件事的期望次数是x 就可以列出方程: x=1+ ...
- 算法刷题-数论-组合数、快速幂、逆元、递推求组合数、逆元求组合数
文章目录 acwing885. 求组合数 I(递推:数据范围:2000) acwing875. 快速幂(a的k次方 模 b) acwing876. 快速幂求逆元 acwing886. 求组合数 II( ...
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...
- 51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...
- 线性求逆元模板_算法学习笔记(9):逆元
https://zhuanlan.zhihu.com/p/105467597在数论中,如果 ,我们就说 和 在模 意义下互为乘法逆元,记作 . 逆元有什么用呢?我们常常遇到一些题目要求结果对一个大质数 ...
- 【BZOJ3823】【East!模拟赛_Round5T1】定情信物 推公式+线性筛逆元(推公式法比出题人简)
题解1: 我们定义点为0维元素.线为1维元素.面为2维元素-- 既然一个低维超方体在对应新轴上平移得到高一维的超方体,比如二维超方体为一个面,然后沿新出现的z轴拓展,那么一个低维元素就会增加一维变成高 ...
- 线性求逆元模板_ZXBlog/ACM模板(C++).md at bb6f2522054d5370df79222461293721e8edede2 · cw1027/ZXBlog · GitHub...
ACM模板(C++) 1.大数 加法,乘法模板 //题目链接 : http://poj.org/problem?id=2506 //题目大意 : 就是问你用2*1,1*2,2*2的砖拼成2*n的长方形 ...
最新文章
- 32-第3章 数据链路层--抓包分析数据帧格式
- 搭配飞行员 dinic
- Hi3516DV300 U-boot移植应用开发指南(1)
- 在S/4HANA扩展字段的Available Fields列表里,看不到自己创建的扩展字段该怎么办
- MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
- 在Linux下不使用密码远程登陆其他Linux
- spring中事务失效的几种情况
- Ajax基础知识梳理 1
- java valueof null,String.valueOf(null) 遇到的坑
- ubuntu 搜狗输入法的安装
- Spark 交互式处理上百 TB 数据
- 使用XMind打开.mmap文件
- 备考系统集成项目管理工程师,其实很简单!(干货)
- ps蒙版使用计算机一级,2014年计算机一级考试PS及基础模拟试题(1)
- 【微信公众号】6、SpringBoot整合WxJava创建自定义菜单
- JavaScript 每日一题 #6
- 女人爱与不爱你的表现
- 89c51控制小车运行c语言,基于STC89C52单片机和STM32的智能小车控制系统
- itchat+在线聊天机器人接口实现微信聊天机器人
- 求推荐一款带日历的电脑桌面记事便签
热门文章
- 计算机网络综合应用实验报告,计算机网络综合实验报告
- linux mysql 主从数据库_Linux下MySQL数据库主从同步配置
- wordpress中直接执行mysql查询语句的常用方法
- php之使用curl对百度orc进行文字识别(二维码识别同理)--base64编码方式(解决image format error)
- PTA甲级15进制转换
- 黑科技神器-uTools
- maven 包上传到远程库,只上传公共模块,微服务或忽略相关模块不上传
- mac 版 SourceTree(git 客户端)跳过登录验证
- win10 Hyper-V 虚拟机 装 boot2docker
- ubuntu 14.04 server 安装virtualbox (虚拟机)deb