牛客國慶集訓派對Day4 I 連通塊計數(思維)

2021-08-28 17:02:43 字數 1305 閱讀 8458

題目大意:小 a 有一棵長的很奇怪的樹,他由 n 條鏈和 1 個點作為根構成,第 i 條鏈有 ai 個點,每一條鏈的一端都與根結點相連。

現在小 a 想知道,這棵長得奇怪的樹有多少非空的連通子樹,你只需要輸出答案對 998244353 取模的值即可

題解:

注意題目說的是每條鏈的一端都與根節點相連,只是這條鏈的最末端,端點與根節點相連,那些在這條鏈上卻非末端端點的點不與根節點相連

這樣的話,連通子樹的個數要分兩種情況

1.包含根節點

對於每一條鏈,鏈的末端與根節點相連,構成了乙個迴路,每一條鏈有a[i]個點,那麼就有在這條鏈選0個、選1個、選2個...選a[i]個,共a[i]+1種情況,

要構成連通子樹,必須得是相連的,就是根-1,根-1-2,根-1-2-3......這樣的情況,不可能直接選中途的1-2這樣

2.不包含根節點

對於每一條鏈,有a[i]個節點,那麼這條鏈能形成的子樹個數是

例如本圖最左邊的鏈,分別給點標號為1,2,3,4

子樹的個數為

①4個節點分別是1個

②1-2,1-2-3,1-2-3-4

③2-3,2-3-4,

④3-4

共10個

因為沒跟根節點連線,就不能乘了,要加起來,所以

踩的坑:

首先,這個題有除以2,但是不用求逆元,當能夠保證整除的情況下不需要求逆元(a[i]*(a[i]+1)也一定能夠整除2),當是分數的情況下才需要求逆元(又漲姿勢了),但是求了也沒錯。

其次,在算的過程中,ans是long long 型別的,而a[i]是int型的,算的過程有相乘,數大了就會爆int的,沒有轉換型別,導致wa了一發。。。。

#includeusing namespace std;

#define mod 998244353

typedef long long ll;

int a[100010];

int main()

ll ans2=0;

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

printf("%lld\n",(ans1+ans2)%mod);

return 0;

}

牛客國慶集訓派對Day4

a 把b n include include include includeusing namespace std int main d 由於是個完全圖,選擇乙個權值最小的點,其他所有的點向它連線就行了。注意點為1的時候輸出0 include include include includeusing...

牛客國慶集訓派對Day4 G I H

小 bo 有 n 個正整數 a1.an,以及乙個權值序列 w1 wn,現在他定義 現在他想知道 你只需要輸出答案對 109 7 取模後的值 第一行乙個正整數 n 第二行 n 個正整數 a1.an 第三行 n 個正整數 w1.wn 輸出答案對 109 7 取模後的值示例1 複製3 1 1 1 1 1 ...

2020牛客國慶集訓派對day4 補題

2020牛客國慶集訓派對day4 b 題意 題意 求最長等差序列的長度。dp 攤派了我講不明白,參考下這兩篇部落格吧 捂臉 傳送門1 傳送門2 include include include include include include include using namespace std ty...