BZOJ4011 HNOI2015 落憶楓音

2021-08-07 17:31:12 字數 2440 閱讀 7302

不妨假設楓葉上有 n個穴位,穴位的編號為 1 ~  n。有若干條有向的脈絡連線著這些穴位。穴位和脈絡組成乙個有向無環圖——稱之為脈絡圖(例如圖 1),穴位的編號使得穴位 1 沒有從其他穴位連向它的脈絡,即穴位 1 只有連出去的脈絡;由上面的故事可知,這個有向無環圖存在乙個樹形子圖,它是以穴位 1為根的包含全部n個穴位的一棵樹——稱之為脈絡樹(例如圖 2和圖 3給出的樹都是圖1給出的脈絡圖的子圖);值得注意的是,脈絡圖中的脈絡樹方案可能有多種可能性,例如圖2和圖 3就是圖 1給出的脈絡圖的兩個脈絡樹方案。 

脈絡樹的形式化定義為:以穴位 r 為根的脈絡樹由楓葉上全部 n個穴位以及 n-  1 條脈絡組成,脈絡樹里沒有環,亦不存在從乙個穴位連向自身的脈絡,且對於楓葉上的每個穴位 s,都存在一條唯一的包含於脈絡樹內的脈絡路徑,使得從穴位r 出發沿著這條路徑可以到達穴位 s。 現在向脈絡圖新增一條與已有脈絡不同的脈絡(注意:連線 2個穴位但方向不同的脈絡是不同的脈絡,例如從穴位3到4的脈絡與從4到3的脈絡是不同的脈絡,因此,圖 1 中不能新增從 3 到 4 的脈絡,但可新增從 4 到 3 的脈絡),這條新脈絡可以是從乙個穴位連向自身的(例如,圖 1 中可新增從 4 到 4 的脈絡)。原脈絡圖新增這條新脈絡後得到的新脈絡圖可能會出現脈絡構成的環。 請你求出新增了這一條脈絡之後的新脈絡圖的以穴位 1 為根的脈絡樹方案數。由於方案可能有太多太多,請輸出方案數對 1,000,000,007 取模得到的結果。 

輸入檔案的第一行包含四個整數 n、m、x和y,依次代表楓葉上的穴位數、脈

絡數,以及要新增的脈絡是從穴位 x連向穴位y的。

接下來 m行,每行兩個整數,由空格隔開,代表一條脈絡。第 i 行的兩個整數

為ui和vi,代表第 i 條脈絡是從穴位 ui連向穴位vi的。 

輸出一行,為新增了從穴位 x連向穴位 y的脈絡後,楓葉上以穴位 1 為根的脈

絡樹的方案數對 1,000,000,007取模得到的結果。 

4 4 4 3

1 2

1 3

2 4

3 2

3對於所有測試資料,1 <= n <= 100000,n - 1 <= m <= min(200000, n(n – 1) / 2), 

1 <= x, y, ui, vi <= n。

題解

dp+拓撲。思路題。

先考慮乙個簡單的問題,如果不加這條新邊,那麼方案數是除了1號點之外所有點的入度相乘。現在加上這條新邊,還這樣乘完,會因為有環而多算。所以要減去這些多算的。(假設新增的邊是s->t,那麼對於原圖中t->s的每一條路徑.不在該路徑上的點的入度的乘積的和就是成環的方案數.)我也不知道為什麼,如果哪位大佬知道為什麼,求教。。。

先假設明白了吧,這樣用dp[i]表示t到i的路徑數,由於要轉移到j,所以要出去剛才的貢獻。在mod意義下就是乘以它的逆元。。先線性求逆元。再拓撲dp一下就行了。神題

ni[i]=-(mod/i)*(ni[mod%i])%mod;

證明:強部落格:

這個做法實際上是這樣的,首先 1−1

≡1(modp)

然後我們設 p=k

⋅i+r

,r1<

i<

p

再將這個式子放到

modp

意義下就會得到k⋅

i+r≡

0(modp

)

兩邊同時乘上 i−1

⋅r−1

就會得到 k

⋅r−1

+i−1

i−1i

−1≡≡

≡0−k

⋅r−1

−⌊pi

⌋⋅(p

modi)−

1(modp)(

modp)(

modp

)

#include#include#include#include#include#define ll long long

#define mod 1000000007

using namespace std;

const int maxn=200010;

queueq;

int pre[maxn*2],other[maxn*2],last[maxn*2],num;

int ru[maxn*2],in[maxn*2];

ll ni[maxn*2],dp[maxn],ans;

int n,m,s,t;

void add(int x,int y)

void niyuan()

void tuopu()}}

}int main()

in[t]++;

ans=1;

for(int i=2;i<=n;i++)

if(t==1)

tuopu();

printf("%lld\n",(ans-dp[s]+mod)%mod);

return 0;

}

BZOJ 4011 HNOI2015 落憶楓音

題意 給乙個有向無環圖,然後叫一條邊,問以1為根的生成樹數量。題面好長啊,出題人真能編故事 先考慮不加那條邊,則麼ans d 2 d 3 d 4 d n d為入度 因為在乙個dag中,只要除根以外的點每個點選一條入邊,就能獲得一棵生成樹。現在考慮加了這條邊,如果再這麼算,就有可能出現環的情況,所以我...

BZOJ4011 HNOI2015 落憶楓音

用脈絡樹總數減去不合法的情況 即樹上有環的情況 拓撲序dp,注意特判連的邊指向1的情況 學到了新姿勢 線性求逆元 原理 假設現在要求a的逆元,x mod a,y mod a ax y 0 ax y a 1 x y 1 ax y 0 ax y a 1 x y 1 code include includ...

bzoj4011 HNOI2015 落憶楓音

description 恆逸,你相信靈魂的存在嗎?郭恆逸和姚楓茜漫步在楓音鄉的街道上。望著漫天飛舞的紅楓,楓茜突然問出 這樣乙個問題。相信吧。不然我們是什麼,一團肉嗎?要不是有靈魂 我們也不可能再見 到你姐姐吧。恆逸給出了乙個略微無厘頭的回答。楓茜聽後笑了笑。那你仔細觀察過楓葉嗎?說罷,楓茜伸手,接...