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]村民排队 递推+组合数+线性求逆元相关推荐

  1. 【训练题22:线性求逆元】【模板】乘法逆元 | 洛谷 P3811

    [模板]乘法逆元 难度 普及/提高\color{yellow}普及/提高普及/提高 板子题,给出两种方法 题意 给 n,pn,pn,p 求出所有 i∈[1,n]i\in[1,n]i∈[1,n]在模 p ...

  2. 取模除法(逆元)(费马小定理)(线性求逆元)

    文章目录 引言 逆元 费马小定理 内容 应用 证明 线性求逆元 thanks for reading! 引言 我们做题时经常会由于答案过大,被要求使答案对一个质数取模 我们都知道,加和乘对取模是没有影 ...

  3. 求逆元(线性求逆元)及其扩展欧几里得

    线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...

  4. P5081 Tweetuzki爱取球(期望)(线性求逆元)

    文章目录 题目描述 解析 代码 题目描述 解析 首先有一个很重要的引理: 若一件事做成的概率是p,则其做成需要次数的期望是1/p 为什么呢? 我们设做成这件事的期望次数是x 就可以列出方程: x=1+ ...

  5. 算法刷题-数论-组合数、快速幂、逆元、递推求组合数、逆元求组合数

    文章目录 acwing885. 求组合数 I(递推:数据范围:2000) acwing875. 快速幂(a的k次方 模 b) acwing876. 快速幂求逆元 acwing886. 求组合数 II( ...

  6. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  7. 51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  8. 线性求逆元模板_算法学习笔记(9):逆元

    https://zhuanlan.zhihu.com/p/105467597在数论中,如果 ,我们就说 和 在模 意义下互为乘法逆元,记作 . 逆元有什么用呢?我们常常遇到一些题目要求结果对一个大质数 ...

  9. 【BZOJ3823】【East!模拟赛_Round5T1】定情信物 推公式+线性筛逆元(推公式法比出题人简)

    题解1: 我们定义点为0维元素.线为1维元素.面为2维元素-- 既然一个低维超方体在对应新轴上平移得到高一维的超方体,比如二维超方体为一个面,然后沿新出现的z轴拓展,那么一个低维元素就会增加一维变成高 ...

  10. 线性求逆元模板_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的长方形 ...

最新文章

  1. 32-第3章 数据链路层--抓包分析数据帧格式
  2. 搭配飞行员 dinic
  3. Hi3516DV300 U-boot移植应用开发指南(1)
  4. 在S/4HANA扩展字段的Available Fields列表里,看不到自己创建的扩展字段该怎么办
  5. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
  6. 在Linux下不使用密码远程登陆其他Linux
  7. spring中事务失效的几种情况
  8. Ajax基础知识梳理 1
  9. java valueof null,String.valueOf(null) 遇到的坑
  10. ubuntu 搜狗输入法的安装
  11. Spark 交互式处理上百 TB 数据
  12. 使用XMind打开.mmap文件
  13. 备考系统集成项目管理工程师,其实很简单!(干货)
  14. ps蒙版使用计算机一级,2014年计算机一级考试PS及基础模拟试题(1)
  15. 【微信公众号】6、SpringBoot整合WxJava创建自定义菜单
  16. JavaScript 每日一题 #6
  17. 女人爱与不爱你的表现
  18. 89c51控制小车运行c语言,基于STC89C52单片机和STM32的智能小车控制系统
  19. itchat+在线聊天机器人接口实现微信聊天机器人
  20. 求推荐一款带日历的电脑桌面记事便签

热门文章

  1. 计算机网络综合应用实验报告,计算机网络综合实验报告
  2. linux mysql 主从数据库_Linux下MySQL数据库主从同步配置
  3. wordpress中直接执行mysql查询语句的常用方法
  4. php之使用curl对百度orc进行文字识别(二维码识别同理)--base64编码方式(解决image format error)
  5. PTA甲级15进制转换
  6. 黑科技神器-uTools
  7. maven 包上传到远程库,只上传公共模块,微服务或忽略相关模块不上传
  8. mac 版 SourceTree(git 客户端)跳过登录验证
  9. win10 Hyper-V 虚拟机 装 boot2docker
  10. ubuntu 14.04 server 安装virtualbox (虚拟机)deb