bzoj5293: [Bjoi2018]求和
一眼过去k那么小,又意识到dep肯定是连续的,那就打表前缀和啊
输出取mod有点恶心,还是不能怕麻烦写拍啊。。。
鄙视自己bl又写错了一次。。。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const LL mod=998244353; struct node { int x,y,next; }a[610000];int len,last[310000]; void ins(int x,int y) { len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len; } int Bin[25]; int f[25][310000],dep[310000]; void dfs(int x) { for(int i=1;dep[x]>=Bin[i];i++)f[i][x]=f[i-1][f[i-1][x]]; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(y!=f[0][x]) { f[0][y]=x; dep[y]=dep[x]+1; dfs(y); } } } int LCA(int x,int y) { if(dep[x]<dep[y])swap(x,y); for(int i=22;i>=0;i--) if(dep[x]-dep[y]>=Bin[i])x=f[i][x]; if(x==y)return x; for(int i=22;i>=0;i--) if(dep[x]>=Bin[i]&&f[i][x]!=f[i][y])x=f[i][x],y=f[i][y]; return f[0][x]; } //--------------get_LCA---------------------------- LL mi[310000],s[60][300100];//s[t][i]为 sigema(0~i)x x^t void yu() { Bin[0]=1;for(int i=1;i<=22;i++)Bin[i]=Bin[i-1]*2; s[0][0]=0;for(int i=1;i<=300000;i++)mi[i]=1,s[0][i]=s[0][i-1]+1; for(int t=1;t<=50;t++) { s[t][0]=0; for(int i=1;i<=300000;i++) { mi[i]=(mi[i]* (LL(i)) )%mod; s[t][i]=(s[t][i-1]+mi[i])%mod; } } } //-----------------yu------------------------- int main() { freopen("data.in","r",stdin); freopen("1.out","w",stdout); yu(); int n,x,y,k; scanf("%d",&n); len=0;memset(last,0,sizeof(last)); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); ins(x,y);ins(y,x); } f[0][1]=0;dep[1]=0;dfs(1); int Q; scanf("%d",&Q); while(Q--) { scanf("%d%d%d",&x,&y,&k); int lca=LCA(x,y); printf("%lld\n",(((s[k][dep[x]]+s[k][dep[y]]-s[k][dep[lca]]-s[k][dep[lca]-1])%mod)+mod)%mod); } return 0; }
pain and happy in the cruel world.