设 F k F_k Fk 为斐波那契数列的第 k k k 项。给出 N , C , K N,C,K N,C,K,求 ( F 0 ) K + ( F C ) K + ( F 2 C ) K + ⋯ + ( F N C ) K (F_0)^K+(F_C)^K+(F_{2C})^K+\cdots+(F_{NC})^K (F0)K+(FC)K+(F2C)K+⋯+(FNC)K对 1 0 9 + 9 10^9+9 109+9 取模。
N , C ≤ 1 0 18 , K ≤ 1 0 5 N,C\le 10^{18},K\le 10^5 N,C≤1018,K≤105
注意到模 1 0 9 + 9 10^9+9 109+9 意义下存在 5 5 5 的二次剩余。直接代入通项,二项式展开后就是等比数列求和。
给一个无向图,点有点权。每次修改一个点的点权,或询问与某个点相连的所有点的点权的mex。
n , m , q ≤ 1 0 5 n,m,q\le 10^5 n,m,q≤105
把点按照度数是否大于 n \sqrt n n 分类,称为小点和大点。对每个大点用分块维护mex。修改点权时,维护相连的大点的答案。询问时,小点暴力询问,大点分块询问。
将 τ \tau τ 换元成 1 x \frac{1}{x} x1 后,发现原式就等于 ζ ( 4 N ) ζ 2 ( 2 N ) \frac{\zeta(4N)}{\zeta^2(2N)} ζ2(2N)ζ(4N),其中 ζ ( N ) \zeta(N) ζ(N) 为黎曼zeta函数。通过 ζ ( 2 n ) = B 2 n 2 ( 2 n ) ! ( 2 π ) 2 n \zeta(2n)=\frac{B_{2n}}{2(2n)!}(2\pi)^{2n} ζ(2n)=2(2n)!B2n(2π)2n
转化为求伯努利数。时间复杂度 O ( n log n ) O(n\log n) O(nlogn)。
给出 n n n,计算 ∑ 1 ≤ a < b ≤ n , gcd ( a , b ) = 1 , a + b ≥ n 1 a b \sum_{1\le a1≤a<b≤n,gcd(a,b)=1,a+b≥n∑ab1
T ≤ 1 0 4 , n ≤ 1 0 8 T\le 10^4,n\le 10^8 T≤104,n≤108
令 f n = ∑ 1 ≤ a < b ≤ n , gcd ( a , b ) = 1 , a + b ≥ n 1 a b f_n=\sum_{1\le afn=1≤a<b≤n,gcd(a,b)=1,a+b≥n∑ab1
g n = ∑ 1 ≤ a < b ≤ n , gcd ( a , b ) = 1 , a + b = n 1 a b g_n=\sum_{1\le agn=1≤a<b≤n,gcd(a,b)=1,a+b=n∑ab1
则 g n = ∑ 1 ≤ a < n − a , gcd ( a , n ) = 1 1 a ( n − a ) = 1 n ∑ 1 ≤ a ≤ n , gcd ( a , n ) = 1 1 a g_n=\sum_{1\le a
且 f n = f n − 1 + g n − g n − 1 = f n − 2 + g n − 1 − g n − 2 + g n − g n − 1 = ⋯ = 1 2 + g n f_n=f_{n-1}+g_n-g_{n-1}=f_{n-2}+g_{n-1}-g_{n-2}+g_n-g_{n-1}=\cdots=\frac{1}{2}+g_n fn=fn−1+gn−gn−1=fn−2+gn−1−gn−2+gn−gn−1=⋯=21+gn
反演求出 g n g_n gn就没了。
给一个字符串 S S S,求 S S S的每个前缀的字典序最大的后缀所在的下标。
∣ S ∣ ≤ 1 0 6 , ∑ ∣ S ∣ ≤ 2 ∗ 1 0 7 |S|\le 10^6,\sum|S|\le 2*10^7 ∣S∣≤106,∑∣S∣≤2∗107
把 S S S 进行Lyndon分解成 w 1 , ⋯ , w k w_1,\cdots,w_k w1,⋯,wk 后,最后一个Lyndon串 w k w_k wk 就是 S S S 的最小后缀。用扩展kmp求出 w k w_k wk 的每个后缀与 w k w_k wk 的lcp,从后往前,设当前位置 p p p 的lcp为 L L L,则把 [ p , p + L ) [p,p+L) [p,p+L) 中未被标记的位置的答案 p p p。删去 w k w_k wk 后对剩下的串重复之前的操作。时间复杂度 O ( n ) O(n) O(n)。
给一个长度为 n n n 的数组 a a a,定义一个数组的权值为 ∑ i = 1 n − 1 ∣ a i + 1 − a i ∣ \sum_{i=1}^{n-1}|a_{i+1}-a_i| i=1∑n−1∣ai+1−ai∣
求在 a a a 的每一种排列中,权值严格前 k k k 大方案的权值,以及每种方案的方案数。
n ≤ 600 , k ≤ 20 n\le 600, k\le 20 n≤600,k≤20
把 a a a 从小到大排列得到 b b b,则 ∣ a i + 1 − a i ∣ |a_{i+1}-a_i| ∣ai+1−ai∣ 等于 b b b 的某些相邻段的区间和。因此可以考虑统计每一个 b i + 1 − b i b_{i+1}-b_i bi+1−bi 的贡献之和。注意到 b i + 1 − b i b_{i+1}-b_i bi+1−bi 贡献的系数等于有多少对 ( a i , a i + 1 ) (a_i,a_{i+1}) (ai,ai+1) 满足一个数在 b i + 1 b_{i+1} bi+1 前面,另一个数在 b i b_i bi 后面。从小到大插入 b i b_i bi,设 f i , j , t f_{i,j,t} fi,j,t 表示插入前 i i i 个数,组成了 j j j 个连通块,有 t = 0 / 1 / 2 t=0/1/2 t=0/1/2 个数被作为 a 1 a_1 a1 或 a n a_n an 的前 k k k 大方案以及方案数。转移时讨论新插入的数的情况,并用归并排序合并方案。
给一棵 n n n 个点的树,每个点有颜色。有 m m m 次操作,每次会修改一个点的颜色,或比较两个条路径谁的颜色出现次数更多。
m ≤ 500000 , n ≤ 10000 m\le 500000,n\le 10000 m≤500000,n≤10000
注意到 k k k 个 [ 0 , 1 ] [0,1] [0,1] 的随机实数的最小值的期望为 1 k + 1 \frac{1}{k+1} k+11。对于一个大小为 k k k 的集合,如果给每个元素随机一个正整数,那么多次采样得到的平均最小值越小说明 k k k 的值越大。
于是我们可以进行若干次采样,每次对每种颜色随机一个正整数,令每个点的点权为改颜色的权值,然后询问路径上点权最小值,并把 k k k 次采样结果相加以粗略比较两条树链的颜色数大小。 k k k 只要取到几十即可。用全局平衡二叉树替代树链剖分可以做到一个 log \log log。
给出 n n n 个形如 f ( x ) = ( x − a ) 4 + b f(x)=(x-a)^4+b f(x)=(x−a)4+b 的函数。要求支持 m m m 个操作:加入一个形如 ( x − a ) 4 + b (x-a)^4+b (x−a)4+b 的四次函数,删除一个四次函数,或询问在 x x x 固定时所有函数的最小值。
n , m ≤ 1 0 5 n,m\le 10^5 n,m≤105
线段树分治,将每个函数插入到线段树的 O ( log n ) O(\log n) O(logn) 个节点上,然后对每个节点分别处理。考虑处理 a i ≤ x a_i\le x ai≤x 时的贡献。发现若 a i ≤ a j a_i\le a_j ai≤aj 且 f i ( x ) ≤ f j ( x ) f_i(x)\le f_j(x) fi(x)≤fj(x),那么对于更大的 x x x 必然也满足,也就是说将询问按照 x x x 排序后,存在决策单调性。使用分治解决即可。
时间复杂度 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)。
有 n n n 件物品,每个物品有一个种类 t i t_i ti 以及参数 a i , b i , c i , d i a_i,b_i,c_i,d_i ai,bi,ci,di。从中选出若干件物品,设组成的集合为 S S S,要求每种物品最多选一件,最大化 ( 100 + ∑ i ∈ S a i ) ( 100 + ∑ i ∈ S b i ) ( 100 + ∑ i ∈ S c i ) ( 100 + ∑ i ∈ S d i ) (100+\sum_{i\in S} a_i)(100+\sum_{i\in S}b_i)(100+\sum_{i\in S}c_i)(100+\sum_{i\in S}d_i) (100+i∈S∑ai)(100+i∈S∑bi)(100+i∈S∑ci)(100+i∈S∑di)
n , k ≤ 50 , 0 ≤ a i , b i , c i , d i ≤ 100 n,k\le 50,0\le a_i,b_i,c_i,d_i\le 100 n,k≤50,0≤ai,bi,ci,di≤100
注意到搜索的最坏复杂度为 O ( 2 ∗ 3 16 ) O(2*3^{16}) O(2∗316),直接搜索即可。
有 n n n 块肉,每块肉有个出锅时间和食用时间。肉只有出锅后才能吃,每个时刻不能同时食用多块肉。对于每个 k ( 1 ≤ k ≤ n ) k(1\le k\le n) k(1≤k≤n),求出若能够选择其中 k k k 块肉来吃,最短需要多少时间才能吃完。
n ≤ 300000 n\le 300000 n≤300000
来自官方题解:
注意到答案可以增量构造,即往吃 k k k 份肉的最优解中加入一份肉可以得到吃 k + 1 k+1 k+1 份肉的最优解,因此存在一个顺序 o r d 1 , o r d 2 , ⋯ , o r d n ord_1,ord_2,\cdots,ord_n ord1,ord2,⋯,ordn,满足 o r d 1 , o r d 2 , ⋯ , o r d k ord_1,ord_2,\cdots,ord_k ord1,ord2,⋯,ordk 是吃 k k k 份肉的一个最优解吃的肉对应的集合。
假设确定了要吃哪些肉,那么肯定是按照捞出锅的时间从小到大吃。按照出锅时间从小到
大依次考虑每份肉,在 o r d 1 , o r d 2 ⋯ , o r d i − 1 ord_1,ord_2\cdots,ord_{i-1} ord1,ord2⋯,ordi−1 中找到一个位置插入第 i i i 份肉。令第 i i i 份肉的出锅时间为 a a a,吃掉它的时间为 b b b,设 o r d 1 , o r d 2 , ⋯ , o r d k ord_1,ord_2,\cdots,ord_k ord1,ord2,⋯,ordk 里按照出锅时间顺序吃掉前 k k k 份肉所需的时间为 t k t_k tk,则将 o r d k ord_k ordk 替换成第 i i i 份肉后,对应的方案所需的时间为 max ( t k − 1 , a ) + b \max(t_{k-1},a) + b max(tk−1,a)+b,如果 max ( t k − 1 , a ) + b < t k \max(t_{k-1}, a) + b < t_k max(tk−1,a)+b<tk,则第 i i i 份肉应该插在 o r d k ord_k ordk 之前。注意到满足条件的 k k k 是 o r d ord ord 序列的一个后缀,所以可以二分找到对应的位置,将第 i i i 份肉插入 o r d ord ord 序列,并将后面部分的 t t t 都修正为 max ( t , a ) + b \max(t, a) + b max(t,a)+b。
为了加速这个过程,可以用平衡树维护 o r d ord ord 序列,每个位置记录 t k t_k tk 以及 t k − 1 t_k-1 tk−1 方便二分,在修正 t t t 为 max ( t , a ) + b \max(t, a) + b max(t,a)+b 时,根据 t t t 的单调性将 t t t 的一个区间赋值为 a + b a+b a+b,再将一个后缀加上 b b b。最后得到的 t t t 序列就是答案。
时间复杂度 O ( n log n ) O(n\log n) O(nlogn)。
给一个长度为 n n n 的字符串 s s s。定义 E ( t ) E(t) E(t) 表示在一个空串 h h h 中,每次等概率随机在末尾加入一个小写字母,直到 t t t 成为 h h h 的子串停止, h h h 的期望长度是多少。每次询问给出 s s s 的两个回文子串 s 1 , s 2 s_1,s_2 s1,s2,比较 E ( s 1 ) E(s_1) E(s1) 和 E ( s 2 ) E(s_2) E(s2) 的大小。
n , q ≤ 1 0 5 n,q\le 10^5 n,q≤105
经典结论 E ( t ) = ∑ i = 1 ∣ t ∣ a i m i E(t)=\sum_{i=1}^{|t|}a_im^i E(t)=i=1∑∣t∣aimi
其中 m m m 为字符集大小, a i = 0 / 1 a_i=0/1 ai=0/1 表示 t t t 长度为 i i i 的前缀是否是 t t t 的一个 border。那么比较 E ( s 1 ) E(s_1) E(s1) 和 E ( s 2 ) E(s_2) E(s2),只用比较把 s 1 , s 2 s_1,s_2 s1,s2 的 border 从大到小排序后,形成序列的字典序大小。
建出 s s s 的回文树,一个串的所有 border 就是 fail 树到根路径上的所有节点。由于每个点到根路径上的串长度必然是 O ( log n ) O(\log n) O(logn) 个连续的等差数列,可以先倍增跳到两个串对应的节点,然后暴力比较每个等差数列。时间复杂度 O ( ( n + q ) log n ) O((n+q)\log n) O((n+q)logn)。
有一棵 n n n 个点的树,在上面选取 m m m 个点作为关键点。找树上的一个点,使得所有关键点到该点的距离之和最小。求所有 ( n m ) \binom{n}{m} (mn) 种方案的最小距离和之和。
n ≤ 1 0 6 n\le 10^6 n≤106
考虑计算每条边的贡献。设一侧的子树大小为 x x x,若枚举其中一边的关键点数 i i i,则贡献为 f ( s ) = ∑ i = 1 m − 1 ( s i ) ( n − s m − i ) ⋅ min ( i , m − i ) f(s)=\sum_{i=1}^{m-1}\binom{s}{i}\binom{n-s}{m-i}\cdot \min(i, m - i) f(s)=i=1∑m−1(is)(m−in−s)⋅min(i,m−i)
令 p = ⌊ m − 1 2 ⌋ p=\lfloor\frac{m-1}{2}\rfloor p=⌊2m−1⌋,则有 f ( s ) = ∑ i = 1 p ( ( s i ) ( n − s m − i ) + ( s m − i ) ( n − s i ) ) ⋅ i + [ m m o d 2 = 0 ] ( s m / 2 ) ( n − s m / 2 ) ( m / 2 ) f(s)=\sum_{i=1}^p\Big(\binom{s}{i}\binom{n-s}{m-i}+\binom{s}{m-i}\binom{n-s}{i}\Big)\cdot i+[m\bmod 2=0]\binom{s}{m/2}\binom{n-s}{m/2}(m/2) f(s)=i=1∑p((is)(m−in−s)+(m−is)(in−s))⋅i+[mmod2=0](m/2s)(m/2n−s)(m/2)
考虑如何计算括号内第一项之和 g ( s ) = ∑ i = 1 p ( s i ) ( n − s m − i ) i = s ∑ i = 1 p ( s − 1 i − 1 ) ( n − s m − i ) = s ⋅ h ( s ) g(s)=\sum_{i=1}^p\binom{s}{i}\binom{n-s}{m-i}i=s\sum_{i=1}^p\binom{s-1}{i-1}\binom{n-s}{m-i}=s\cdot h(s) g(s)=i=1∑p(is)(m−in−s)i=si=1∑p(i−1s−1)(m−in−s)=s⋅h(s)
考虑 h ( s ) h(s) h(s) 的组合意义:将 m − 1 m-1 m−1 个无标号球放入 n − 1 n-1 n−1 个带标号盒子中,每个盒子至多放一个球,且前 s − 1 s-1 s−1 个盒子至多放 p − 1 p-1 p−1 个球的方案。当从 s − 1 s-1 s−1 变为 s s s 时,新增的不合法方案数为:第 s − 1 s-1 s−1 个盒子放了一个球,前 s − 2 s-2 s−2 个盒子中恰好放置了 p − 1 p-1 p−1 个球。从而可以 O ( n ) O(n) O(n) 算出所有的 h ( s ) h(s) h(s)。
时间复杂度 O ( n ) O(n) O(n)。