[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)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; typedef long long LL;
const int mod=((int)1e9)+,maxn=,N=;
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[]=;
for(int i=;i<=maxn;i++) jc[i]=(jc[i-]*i)%mod;
inv[]=;
for(int i=;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+;
for(int i=;i<=n;i++) fa[i]=-;
al=;
memset(first,,sizeof(first));
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
fa[x]=y;
ins(y,x);
}
for(int i=;i<=n;i++)
if(fa[i]==-) fa[i]=rt,ins(rt,i);
memset(sum,,sizeof(sum));
dfs(rt);
LL ans=jc[sum[rt]-];
for(int i=;i<=n;i++)
{
ans=ans*inv[sum[i]]%mod;
}
printf("%lld\n",ans);
} return ;
}
#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;}
[uva11174]村民排队 递推+组合数+线性求逆元的更多相关文章
- 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 洛谷 P3811 【模板】乘法逆元(欧拉定理&&线性求逆元)
题目传送门 逆元定义 逆元和我们平时所说的倒数是有一定的区别的,我们平时所说的倒数是指:a*(1/a) = 1,那么逆元和倒数之间的区别就是:假设x是a的逆元,那么 a * x = 1(mod p), ...
- 线性齐次递推式快速求第n项 学习笔记
定义 若数列 \(\{a_i\}\) 满足 \(a_n=\sum_{i=1}^kf_i \times a_{n-i}\) ,则该数列为 k 阶齐次线性递推数列 可以利用多项式的知识做到 \(O(k\l ...
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...
- 一种递推组合数前缀和的Trick
记录一下一种推组合数前缀和的方法 Trick 设\(\sum_{i = 0}^m C_n^i = S(n, m)\) \(S\)是可以递推的 \(S(n, m + 1) = S(n, m) + C_{ ...
- bzoj3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——递推 / 组合数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 对于这种有点巧妙的递推还是总是没有思路... 设计一个状态 f[i] 表示第 i 位置 ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...
- 【数学/扩展欧几里得/线性求逆元】[Sdoi2008]沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
随机推荐
- hustoj题目标准xml格式
具体格式可见google code. 分析了一下发现像<time_limit></time_limit><memory_limit></memory_limi ...
- 伟大的淘宝IP库的API接口竟然提示503挂掉了
1 淘宝IP库惊现503错误 吃完晚饭,大概6点半了,天色已暗,太阳早就落山了.回到宿舍打开博客一看,傻眼了:博客每篇文章的评论者的地理信息全部处于“正在查询中……”的状态.这神马情况,不会是被淘宝封 ...
- return 返回字符串
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- Linux和Windows文件路径
linux系统下的文件夹路径和window下的不一样,windows下就需要写成“\\photos"因为java会把第一个"\"当成转义字符给“吃了”.但在linux下就 ...
- [剑指Offer] 46.孩子们的游戏
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- BZOJ 1911 特别行动队(斜率优化DP)
应该可以看出这是个很normal的斜率优化式子.推出公式搞一搞即可. # include <cstdio> # include <cstring> # include < ...
- [NOIP2016]愤怒的小鸟 状态压缩dp
题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...
- NAT穿透(UDP打洞)
1.NAT(Network Address Translator)介绍 NAT有两大类,基本NAT和NAPT. 1.1.基本NAT 静态NAT:一个公网IP对应一个内部IP,一对一转换 动态NAT:N ...
- poj 1018 Communication System (枚举)
Communication System Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22380 Accepted: ...
- 安装单机Hadoop系统(完整版)——Mac
在这个阴雨绵绵的下午,没有睡午觉的我带着一双惺忪的眼睛坐在了电脑前,泡上清茶,摸摸已是略显油光的额头(笑cry),,奋斗啊啊啊啊!!%>_<% 1.课程回顾. 1.1 Hadoop系统运行 ...