題目大意:小 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...