社区讨论
求调,思路正确清晰,样例过但0分,(read -))
P4427[BJOI2018] 求和参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mm7rge5t
- 此快照首次捕获于
- 2026/03/01 21:03 6 天前
- 此快照最后确认于
- 2026/03/04 18:55 4 天前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,MOD=998244353;
vector<int> e[N];
int dep[N],fa[N][21];
long long g[N][51];
void dfs(int s,int f){
dep[s]=dep[f]+1;
fa[s][0]=f;
for(int i=1;i<=20;i++){
fa[s][i]=fa[fa[s][i-1]][i-1];
}
for(int i=0;i<e[s].size();i++){
int v=e[s][i];
if(v==f) continue;
dfs(v,s);
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--){
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if(x==y) return x;
}
for(int i=20;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main(){
int n,x,y,k;
cin>>n;
for(int i=1;i<n;i++){
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
for(int i=1;i<=n;i++){
for(int j=0;j<=50;j++){
if(j==0) g[i][j]=1;
else
g[i][j]=g[i][j-1]*i%MOD;
// cout<<g[i][j]<<' ';
}
// cout<<endl;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=50;j++){
g[i][j]=(g[i][j]+g[i-1][j])%MOD;
}
}
int m;cin>>m;
while(m--){
cin>>x>>y>>k;
int l=lca(x,y);
int ans=(g[dep[x]-1][k]-g[dep[l]-1][k]+g[dep[y]-1][k]-g[dep[l]-2][k])%MOD;
cout<<ans<<endl;
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...