$master$ 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的$k$次方和,而且每次的$k$可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了$pupil$,但$pupil$ 並不會這麼複雜的操作,你能幫他解決嗎?
輸入格式:
第一行包含乙個正整數n,表示樹的節點數。
之後n-1行每行兩個空格隔開的正整數i, j ,表示樹上的一條連線點$i$和點$j$的邊。
之後一行乙個正整數m ,表示詢問的數量。
之後每行三個空格隔開的正整數i, j, k,表示詢問從點i到點j的路徑上所有節點深度的k次方和。由於這個結果可能非常大,輸出其對998244353取模的結果。
樹的節點從1開始標號,其中1號節點為樹的根。
輸出格式:
對於每組資料輸出一行乙個正整數表示取模後的結果。
對$k=1...50$全部預處理出來,然後就是lca模板題了
#include
using
namespace
std;
const
long
long maxn = 300000 + 10;
const
long
long mod = 998244353;
long
long n,m,dep[maxn],father[maxn][25],d[maxn][51];
vector
long> edges[maxn];
inline
long
long
quickpow
(long
long x,long
long y)
inline
void
dfs(long
long now,long
long fa)
}inline
void
init
()inline
long
long
lca(long
long a,long
long b)
return father[a][0];
}int
main
() dep[1] = -1;
father[1][0] = 1;
dfs(1,1);
init();
scanf("%lld",&m);
while (m--)
return
0;}
#include
using
namespace
std;
const
long
long maxn = 300000 + 10;
const
long
long mod = 998244353;
long
long n,m,dep[maxn],father[maxn][25],d[maxn][51];
vector
long> edges[maxn];
inline
long
long
quickpow
(long
long x,long
long y)
inline
void
dfs(long
long now,long
long fa)
}inline
void
init
()inline
long
long
lca(long
long a,long
long b)
return father[a][0];
}int
main
() dep[1] = -1;
father[1][0] = 1;
dfs(1,1);
init();
scanf("%lld",&m);
while (m--)
return
0;}
BJOI2018 求和 樹上字首和,LCA
一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的 k 次方和,而且每次的 k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了pupil,但pupil並不會這麼複雜的操作,你能幫他解決嗎?對每個次數,預處理樹上字首和即可 include using nam...
BJOI2018 鏈上二次求和
bjoi2018 鏈上二次求和 我說今天上午寫部落格吧。怕自己寫一上午,就決定先寫道題。然後我就調了一上午線段樹。花了2h找到lazy標記沒有清空。我tm清空了有沒有標記沒清空標記本身。又花25min找到某個乘法爆int了。int真的淡疼,要不是longlong自帶巨無霸常數,這輩子都不想用int。...
BJOI2018 治療之雨
有 m 1 個數,第乙個數為 p 每輪 選乙個數 1 再依次選 k 個數 1 要求如果第乙個數 n 不能選它 1 如果第乙個數 0 不能選它 1 如果沒有可選的數,跳過該次選擇 問使得第乙個數 0 的期望步數 n le1500 case le10 設 f i 表示當第乙個數為 i 時期望多少輪變為 ...