luogu 4427 求和

bjoi 2018 求和 唯一一道可能切的题一个数组还没开long long就成0分了

题目大意:

一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k次方和,而且每次的k可能是不同的

此处节点深度的定义是这个节点到根的路径上的边数

思路:

考试的时候随便写了个树剖

剖下来之后搞五十个次方的前缀和

然后一个数组乘起来没开long long

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define MAXN 300100
11 #define inf 2139062143
12 #define MOD 998244353
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
19     return x*f;
20 }
21 int n,m,hsh[MAXN],HSH[MAXN],bl[MAXN],sz[MAXN],dep[MAXN],fa[MAXN];
22 int nxt[MAXN<<1],fst[MAXN],to[MAXN<<1],cnt;
23 ll sum[51][MAXN],val[MAXN],res;
24 void add(int u,int v){nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
25 void dfs(int x)
26 {
27     sz[x]=val[x]=1;
28     for(int i=fst[x];i;i=nxt[i])
29     {
30         if(to[i]==fa[x]) continue;
31         dep[to[i]]=dep[x]+1,fa[to[i]]=x;
32         dfs(to[i]);sz[x]+=sz[to[i]];
33     }
34 }
35 void DFS(int x,int anc)
36 {
37     int hvs=0;hsh[x]=++cnt,HSH[cnt]=x,bl[x]=anc;
38     for(int i=fst[x];i;i=nxt[i])
39         if(to[i]!=fa[x]&&sz[to[i]]>sz[hvs])    hvs=to[i];
40     if(!hvs) return ;
41     DFS(hvs,anc);
42     for(int i=fst[x];i;i=nxt[i])
43         if(to[i]!=fa[x]&&to[i]!=hvs) DFS(to[i],to[i]);
44 }
45 int main()
46 {
47     n=read();int a,b,c;
48     for(int i=1;i<n;i++) {a=read(),b=read();add(a,b);add(b,a);}
49     dfs(1);cnt=0;
50     DFS(1,1);
51     for(int i=1;i<=50;i++)
52         for(int j=1;j<=n;j++) (val[j]*=dep[HSH[j]])%=MOD,sum[i][j]=(sum[i][j-1]+val[j])%MOD;
53     m=read();
54     while(m--)
55     {
56         a=read(),b=read(),c=read(),res=0;
57         while(bl[a]!=bl[b])
58         {
59             if(dep[bl[a]]<dep[bl[b]]) swap(a,b);
60             (res+=sum[c][hsh[a]]-sum[c][hsh[bl[a]]-1]+MOD)%=MOD;
61             a=fa[bl[a]];
62         }
63         if(dep[a]>dep[b]) swap(a,b);
64         (res+=sum[c][hsh[b]]-sum[c][hsh[a]-1]+MOD)%=MOD;
65         printf("%lld\n",res);
66     }
67 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8856720.html

时间: 2024-10-07 21:32:51

luogu 4427 求和的相关文章

[Luogu 2261] CQOI2007 余数求和

[Luogu 2261] CQOI2007 余数求和 <题目链接> 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \(10^{9}\) 的范围注定会卡掉暴力. 所以我们要用除法分块来优化. 由题意得:\(ans = \sum_{i=1}^{n} k \bmod i\) 我们知道,\(a \bmod b = a - b \times \lfloor \frac{a}{b} \rfloor\) 因此,\

【Bzoj4555】【Luogu P4091】求和(NTT)

题面 Bzoj Luogu 题解 先来颓柿子 $$ \sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj! \\ =\sum_{j=0}^n2^jj!\sum_{i=0}^nS(i,j) \\ \because S(n, m)=\frac1{m!}\sum_{i=0}^m(-1)^i\binom{m}{i}(m-i)^n=\sum_{i=0}^m\frac{(-1)^i}{i!}\frac{(m-i)^n}{(m-i)!} \\ \therefore=\sum_{j=0}^n2^

解题报告:luogu P5745 【深基附B例】数列求和

题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出,直至满足条件,顺便更新下\(maxn\)值即可. 然后遇见了烦人的头尾双指针,多了个等号就只有\(30\;pts\)了. \(Code\): #include<iostream> #include<cstdio> using namespace std; long long sum=0

Luogu P2261 [CQOI2007]余数求和

最近中考放假几天都在怼一道BJOI2018的水题,但卡死在90pts跑不动啊! 然后今天发现终于过了然而Hack的数据全RE了然后就开始找新的题目来找回信心. 然后发现智能推荐里有这道题,然后想了1min才想到CQOI到底是哪里的原来是重庆呵 其实还是一道比较好的除法分块的入门题.动一下脑子就可以做了. 我们先观察一下最基础的式子: \(\sum_{i=1}^n k\ mod\ i\) 然后我们利用取余的基本性质,即\(k\ mod\ i=k-i\lfloor\frac{k}{i}\rfloor

luogu P4091 [HEOI2016/TJOI2016]求和

传送门 这一类题都要考虑推式子 首先,原式为\[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)*2^j*j!\] 可以看成\[f(n)=\sum_{j=0}^{n}2^j*j!\sum_{i=j}^{n}S(i,j)\] 又因为\[S(i,j)=\frac{1}{j!}\sum_{k=0}^{j}(-1)^k*\binom{j}{k}*(j-k)^i\] 所以\[f(n)=\sum_{j=0}^{n}2^j*j!\sum_{i=0}^{n}\frac{1}{j!}

luogu2261余数求和题解--整除分块

题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\times\) \(i\),于是我们只需要求\(N * k-\sum_{i=1}^N {\lfloor {k/i}\rfloor\times i}\) 这里就需要数论分块,也称作整除分块的知识 结论: \(\forall{i} \in [x,\lfloor {k/{\lfloor {k/x}\rfl

分块-区间求和

一:分块 分块的思想就是通过合适的划分,将一部分信息预处理并保存下来,用空间来换取时间,其实分块是"优化"的暴力,效率比不上树状数组和线段树,但它更通用和容易实现. 二:例题1 给定一个长度为N(N ≤ 10^5)的数列A,然后有M(M ≤ 10^5)个操作指令. 操作1:格式:1 x y k 含义:将区间[x, y]上的每一个数都加上k 操作2:格式:2 x y   含义:输出区间[x, y]内每个数的和 Luogu P3372 这道题用线段树和树状数组都可以很优秀的通过,但我们用这

LG5178 求和

求和 给定数列 \(a_1...a_n\) 及 \(x_0\). 满足 \[ f_{i.j}=\begin{cases} a_i & j=0,i\leq n\x_0 & j=0,i=n+1\f_{i,j-1}+f_{i-1,j-1} & 0 < i,j \leq n+1,j < i\0 & i\leq j \end{cases} \] 求 \[ \sum_{i=0}^{n+1}\sum_{j=0}^{n+1}f_{i,j} \] 但这样太水了 于是给出 \(m\

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo