• 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
    ",(((s[k][dep[x]]+s[k][dep[y]]-s[k][dep[lca]]-s[k][dep[lca]-1])%mod)+mod)%mod);
        }
        return 0;
    }
  • 相关阅读:
    第24课 多线程开发
    第23课 装饰器
    第22课 调用外部程序
    第20课 异常处理
    第19课 习题讲解
    第18课 面向对象
    第17课 调试程序
    第16课 pycharm 使用
    第15课 模块与包
    第14课 再识函数
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8871748.html
Copyright © 2020-2023  润新知