社区讨论
hack点全爆
P4427[BJOI2018] 求和参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi868e54
- 此快照首次捕获于
- 2025/11/21 09:18 4 个月前
- 此快照最后确认于
- 2025/11/21 09:18 4 个月前
CPP
#include<bits/stdc++.h>
#define N 300001
#define MOD 998244353
using namespace std;
void read(int &x){
char c;
while(c=getchar(),!isdigit(c)) continue;
x=c-'0';
while(c=getchar(),isdigit(c)) x=x*10+c-'0';
}
void write(long long x){
if(x>=10) write(x/10);
putchar('0'+x%10);
}
int n,ver[N*2],next[N*2],head[N],tot=0;
void add(int x,int y){ver[++tot]=y,next[tot]=head[x],head[x]=tot;}
int deep[N],lit[N*5],len=0,loc[N];
bool h[N];
int st[N*5][31];
void dfs(int k,int step){
deep[k]=step;lit[++len]=k,loc[k]=len;
for(register int i=head[k];i;i=next[i]){
if(h[ver[i]]) continue;
h[ver[i]]=1;
dfs(ver[i],step+1);
lit[++len]=k;
}
}
void stwork(){
int t=log2(len);
for(register int i=1;i<=len;++i) st[i][0]=lit[i];
for(register int j=1;j<=t;++j)
for(register int i=1;i+(1<<j)-1<=len;++i)
deep[st[i][j-1]]<deep[st[i+(1<<(j-1))][j-1]]?st[i][j]=st[i][j-1]:st[i][j]=st[i+(1<<(j-1))][j-1];
}
int have(int x,int y){
if(x>y) swap(x,y);
int t=(int)log2(y-x+1);
if(deep[st[x][t]]<deep[st[y-(1<<t)+1][t]]) return st[x][t];
else return st[y-(1<<t)+1][t];
}
long long ksm(int x,int y){
long long ans=1,tmp=x;
for(;y;y=y>>1,tmp=(tmp*tmp)%MOD)
y&1?ans=(ans*tmp)%MOD:0;
return ans;
}
int main(){
read(n);
memset(head,0,sizeof(head));
for(register int i=1;i<=n-1;++i){
int x,y;read(x),read(y);
add(x,y),add(y,x);
}
memset(h,0,sizeof(h)),h[1]=1;
dfs(1,0);
stwork();
int T;read(T);
while(T--){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
int lca=have(loc[x],loc[y]);
long long ans=0;
for(register int i=deep[lca]+1;i<=deep[x];++i) ans=(ans+ksm(i,z))%MOD;
for(register int i=deep[lca]+1;i<=deep[y];++i) ans=(ans+ksm(i,z))%MOD;
ans=(ans+ksm(deep[lca],z))%MOD;
write(ans);putchar('\n');
}
return 0;
}
奆佬们hack点怎么过啊???
回复
共 2 条回复,欢迎继续交流。
正在加载回复...