bzoj4011

好题,首先有一个结论,有向无环图的树形图数目=根节点意外入度之积

现在相当于在原图上加一条边问树形图的数目

考虑多出来不合法的方案,一定是成环且包含新加入的边

对于一条路贡献就是∏d[i] [i∉path]

考虑不属于太不和谐,我们设s=∏d[i]

贡献就是s*∏d[i]^(-1)  [i属于path],这样我们就可以dp了

这里学到了一个新知识,就是线性求出1~p-1对于p的逆元

首先1^(-1)≡1 (mod p)

对于范围内i,有ki+r=p

则ki+r≡0 (mod p) 同乘i^(-1)*r^(-1)

有kr^(-1)+i^(-1)≡0 (mod p)

i^(-1)≡-kr^(-1) (mod p)

则i^(-1)≡-[p div i]*(p mod i)^(-1) (mod p)

这样我们就可以递推了

 1 const mo=1000000007;
 2
 3 type node=record
 4        po,next:longint;
 5      end;
 6
 7 var q,c,d,p,f:array[0..100010] of longint;
 8     ni:array[0..200010] of longint;
 9     e:array[0..200010] of node;
10     x0,y0,ans,i,len,n,m,x,y:longint;
11
12 procedure add(x,y:longint);
13   begin
14     inc(len);
15     e[len].po:=y;
16     e[len].next:=p[x];
17     p[x]:=len;
18   end;
19
20 procedure shaker;
21   var i:longint;
22   begin
23     ni[1]:=1;
24     for i:=2 to m+1 do
25       ni[i]:=(-int64(mo div i)*int64(ni[mo mod i]) mod mo+mo) mod mo;
26   end;
27
28 procedure work;
29   var i,h,r,x,y:longint;
30   begin
31     f[y0]:=ans;
32     h:=1;
33     r:=0;
34     for i:=1 to n do
35       if d[i]=0 then
36       begin
37         inc(r);
38         q[r]:=i;
39       end;
40
41     while h<=r do
42     begin
43       x:=q[h];
44       f[x]:=int64(f[x])*int64(ni[c[x]]) mod mo;
45       i:=p[x];
46       while i<>0 do
47       begin
48         y:=e[i].po;
49         f[y]:=(f[y]+f[x]) mod mo;
50         dec(d[y]);
51         if d[y]=0 then
52         begin
53           inc(r);
54           q[r]:=y;
55         end;
56         i:=e[i].next;
57       end;
58       inc(h);
59     end;
60   end;
61
62 begin
63   readln(n,m,x0,y0);
64   for i:=1 to m do
65   begin
66     readln(x,y);
67     add(x,y);
68     inc(d[y]);
69     inc(c[y]);
70   end;
71   shaker;
72   ans:=1;
73   inc(c[y0]);
74   for i:=2 to n do
75     ans:=int64(ans)*int64(c[i]) mod mo;
76   if y0=1 then
77   begin
78     writeln(ans);
79     halt;
80   end;
81   work;
82   writeln((ans-f[x0]+mo) mod mo);
83 end.

时间: 2024-10-25 20:47:50

bzoj4011的相关文章

【bzoj4011 hnoi2015】落忆枫音

题目描述 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂......我们也不可能再见到你姐姐吧.」 恒逸给出了一个略微无厘头的回答.枫茜听后笑了笑. 「那你仔细观察过枫叶吗?」 说罢,枫茜伸手,接住了一片飘落的枫叶. 「其实每一片枫叶都是有灵魂的.你看,枫叶上不是有这么多脉络吗?我听说,枫叶上有一些特殊的位置,就和人的穴位一样.脉络都是连接在这些穴位之间的.枫树的灵魂流过每片枫叶

【bzoj4011】落忆枫音

Description 给出一个有n个点和m条边的有向无环图,1号节点入度为0.这个有向无环图存在一个树形子图,是以1号节点为根的包含全部n个点的一棵树.该树形子图可能有多种可能性. 现在向图中加入一条与已有边不同的有向边(连接两个节点但方向不同视为不同的边),这条边可连向自身.原有向无环图添加新边后得到的新图可能会出现环. 求新图中以1为根的树形子图的方案数.(对1000000007取模) Solution 我们可以得到,有向无环图中树形子图的方案数为2号节点到n号节点的入度的乘积. 设新边为

BZOJ4011 [HNOI2015]落忆枫音

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也不可能再见 到你姐姐吧.」 恒逸给出了一个略微无厘头的回

【BZOJ4011】【HNOI2015】落忆枫音 拓扑图DP,

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45362029"); } 题解: 如果没有后加的边,那么 ans=∏ni=2di ,可以回忆构建树形数据的普遍方法--点 i 连一条 [1,i-1] 的边即可. 然后后加边了以后,有且仅有一些方案会形成环是错误方案. 拓扑图DP就好啦

luogu3244 bzoj4011 HNOI2015 落忆枫音

这道题目题面真长,废话一堆. 另外:这大概是我第一道独立做出来的HNOI2011年以后的题目了吧.像我水平这么差的都能做出来,dalao您不妨试一下自己想想? 题目大意:给一个DAG,其中1号点没有入度,现在新加入一条不重复的边,使得它可能有环.求它的生成子图个数,使得子图正好包含N-1条边且1号点与其它的所有点连通. 题目分析: 我们首先要发现这是一个树的结构!有向的树. 分析树的特点,树的父亲只有一个,我们不妨从这里入手. 在这一个生成子图中,谁是谁的父亲? 我们知道1号点一定是root,这

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ