qbxt2023国庆刷题 Day4 ~ Day5

本帖涉及以下内容:

  1. 超长内容
  2. 感性理解
  3. 思路引导
  4. 屑排版
  5. 恶意卖萌

Day4

没考,因为感觉题全是码农题,感觉有点烂

T1

lcm(a,b,c)=lcm(lcm(a,b),c) ,直接暴力算就好了

然后你就 Wa

因为答案要取模, lcm(a,b,c)modPlcm(lcm(a,b)modP,c)modP

因此我们要质因数分解,取最大质因子,复杂度 O(nA)

T2

爆搜即可

老师曰:一个题求从一个状态到另一个状态的最小步数的话,一般情况用 bfs

这题直接暴力对每个糖看往哪走,走几步就行

但有一个问题,你要怎么把这个状态记下来,防止搜到重复情况

一个非常暴力的做法就是把一张图记下来,但显然还有更优的做法。因为注意到所有的糖果,只能在一行或一列上移动,他的行或列是固定的,我么你只需要记录他会移动的一项即可,用一个二元组 (i,j) 表示第 i 个糖果在 j 列/行

T3

如果没有修改,这是一个非常显然的区间的子区间问题,可以扫描线+线段树历史区间和解决

但有了修改,而且 p 不变,还很小。我们直接考虑在线段树上维护这个东西的个数。

最常见的,我们记 lsi,rsi,num 分别表示当前区间内固定左端点,对于所有右端点组成的数 i(modp) 的个数和当前区间内子区间的个数

但我们发现一个问题, rsi 是好合并的,但 lsi 是不好合并的,因为右端点长度并不确定。但根据抽屉原理,我们可以发现 10kmodp 的循环节 p ,因此我们可以记 lsi,j 表示当前区间下标 i(modp) , 组成的数 j(modp) 的个数,合并时就可以合并了

最终复杂度 O(np2logn)

还有一个做法:

  1. p=2,5,10 时,只要看最后一位即可
  2. p=4,8 时,看最后两位和三位
  3. p=3,9 时,看和能否被 3 整除
  4. p=6,12 时,缝合一下方法 1,2
  5. p=15 时,缝合方法 1,3
  6. p=7,11,13 时,把数从低到高三三分成一位,奇数位之和 偶数位之和
  7. p=14 时,缝合方法 1,6

T4

考虑 n100 ,考虑数位 dp

老师曰:数位 dp 都有一个非常共通的特点:都会记录一个考虑到第 i

dpi,0/1,0/1 表示考虑长为 i 的位(注意这里不是前 i 位,我们考虑从中间往左右延伸),高位是否进位,低位是否需要进位

可能不理解,举个例子就懂了:

糖:     23
顾客:   99
和:    122
22是回文,向高位进位了 1,因此 ++dp[2][1][0]

糖:     22
顾客:   99
和:    121
发现21并不是回文,但如果最低位之前往前进位一个 1 ,则变成22,是一个回文,因此 ++dp[2][1][1]

转移枚举左右两边填什么数,考虑进位

然后 n1018 怎么做,发现题目给的信息很多,而且仔细一看也没有诈骗的信息,因此排除数学题的可能

然后还能怎么想?矩阵即可

前导零怎么办?算到 dpn2dpn3 ,剩下几位暴力即可

杂题选讲

图论四大板块:最短路,生成树,强连通,二分图

  • HDU4786
    无向图,边黑白,求生成树,选的白边数量是斐波那契数列中的某项
    n,m105

    tip1: 这题并不难
    tip2: 对于生成树问题,通常要先求生成树,然后再改一改。但这题没有边权,因此我们给他定边权

    这题既然有黑边和白边,我们让黑边边权为 1 ,白边边权为 0 ,求一遍最小生成树,能得到一个白边最多的生成树。设这棵树有 x 条白边。再做一次最大生成树,能得到白边最少的生成树,有 y 条白边。[x,y] 之间的所有斐波那契数都可取到
    为什么呢?因为我们想让白边个数 +1 ,我们肯定是让一条白边替换一条黑边,所以区间 [x,y] 都可以取到
    复杂度线性。

  • bzoj #2654

    如果白边少了,说明白边兴致不高,要奖励一下
    如果改变多了,说明白边不乖,要惩罚一下
    因此我们不妨对白边弄一个“惩罚值”,具体的,二分一个数 x ,让所有白边的边权加上这个“惩罚值”,然后求最小生成树,判断白边数量是否为 need 即可
    据说这个东西叫 wps 二分

  • CF125E

    把和 1 相连的当做白边,没有的当做黑边,不就是上题吗?
    但要输出方案。这会导致你惩罚值为 x 时答案为 k1x+1k+1 ,显然你知道有 k 条白边的答案,但你无法恰好 k 条白边的方案
    方法1:和出题人斗智斗勇。出题人卡你的原因是读入顺序搞怪,因此 random_shuffle
    方法2:还是随机,我们考虑随机扰动,对于第 i 条白边,令 wi=wi+x+rand()108 ,只需要在实数二分答案即可
    方法3:让相同的数分清严格大小,对于第 i 条白边,令 wi=wi+x+i108 ,不会出现相同的值了

  • bzoj #3332

    有一张无向图,边有权值但你不知道,但你知道 disti,j 表示 ij 经过的边权最小值最大是多少。让你找到一种给边附权的方法,使其满足 disti,j 的性质

    走路径最小值最大,你一定走最大生成树,否则你的最大生成树就是假的了( NOIP2013 货车运输就是用的这个性质,非常重要,需要记住)
    可你边权不知道,你没法求最大生成树,这是一个反向的思路。
    对于一条 ij 的边,附其权值为 disti,j ,跑最大生成树,检查赋值后能否满足这些数,是则 YES ,否则 NO
    因为对于 iwj ,可以知道 wdisti,j ,否则就违反了条件
    而如果 w<disti,j ,则在 ij 的所有路径中,必然有一遍 pvq 满足 v=disti,j 。如果 v<distp,q 我们发现 pvq 也可以递归找到 atb 满足 t=distp,q ,等等等等
    但我们发现我们并不需要递归,因为如果直接让 iwj 使 w=disti,j ,这样其他路径就直接不用考虑了,因此这么干是正确的。

  • bzoj #3080

    LCT 好像可做到数据范围很大,但超纲了
    可能数据范围非常神奇, w50 ,且只要保留两位小数,说明有一些奇技淫巧
    枚举平均数,复杂度 O(100W) ,发现一条边 wi(xix¯)2 求最小生成树即可
    虽然最小生成树的平均数不一定是 x¯ ,但如果不是,一定不优
    复杂度 O(100TW(n+m)logm)

  • uoj #109

    里面有一个点让卡 FloydSPFA+heap 优化
    其中 SPFA+heap 会被卡到 O(2n)

  • N×N 矩阵,每次可以选一行或一列随便乘以一个实数,问能否使得所有数都在 [l,r] 之间

    tip1:刚讲了查分约束,因此这个题是一个查分约束题
    tip2:唯一和大小关系有关的是**所有数在 [l,r] 内,因此我们考虑写出来, lci,j×ai×bjr
    tip3:查分约束是 xixjyi 的形式

    对于这题,我们把 ×bj 变成 ÷1bj ,然后我们可取 log 即可

    差分约束可以解决的问题是不等式,因此我们对于不等式问题就要首先思考差分约束

  • spfa 有两种判负环做法

    1. 常规做法:一个入队列 n+1
    2. 非常规做法:在判负环时,为了防止卡到 O(n2) ,我们跑到 900ms 就返回 YES 即可
  • bzoj #3583

    dpi,j 表示从起点 sj 恰好走 i 步方案数
    dpi,j=kndpi1,k+e(k,j) ,其中 e(k,j) 的算法题目已经给出,复杂度 O(dn2)
    然后今天 T4 也是矩阵优化,还是 1018 ,因此矩阵优化

    老师曰:和 i 没关系,数据范围还很大的 dp 一般都是矩阵优化

    但还没完,矩阵 MN×N 的,复杂度 O(n3logd) ,还是不可过
    对邻接矩阵做矩阵乘法是一个非常经典的问题,既然这个做法做不了,我们就要思考题目的特殊性质,因为我们 k 没有用到复杂度里,也不知道为什么题目要求 e(i,j)=l=1kouti,r×inj,r ,因此我们要想尽办法把他于 k 关联
    我们发现 e(i,j)=l=1kouti,r×inj,r ,我们发现 in 长得好丑,我们交换一下两个下标也无妨。 e(i,j)=l=1kouti,r×inr,j
    而矩阵 M 的第 (i,j) 项就是 e(i,j) ,因此 Md=(out×in)d=out×in×out×...×in
    你以为我要用交换律吗?不!Md=out×(in×out)×...×(in×out)×in ,其中 in×out 得到的矩阵是 k×k 的,人类智慧
    复杂度就变成了 O(k3logd+nk2) ,足够通过

  • CF19E

    无向图,问有哪些边,在删掉它后图变为二分图

    看图是否只由一个奇环构成,如果是,这个奇环上所有边都可以
    然后你就错了
    因为环套环,两个环的交边也是答案
    我们参考 tarjan 的思路,先跑 dfs 序,对于非树边,把树上与这条边相连的路径上标记 +1 ,然后找标记有奇环个数的边即可
    树上差分
    非树边呢?

  • 二分图的最大独立集

    二分图最大独立集 = 总点数 - 最大匹配
    跑匈牙利

    老师曰:图的最大独立集是 NPC 问题,如果看到最大独立集问题,要想是否图为二分图

  • 最大团:选尽可能多的点,使子图是完全图
    求二分图最大团

    最大团和最大独立集是互补的问题
    因此最大团 = 补图的最大独立集

    老师曰:图的最大团 是 NPC 问题,如果看到最大团 问题,要想是否补图图为二分图

  • P2423

    被作为练习题

  • 平面上 N 个点,找到最小距离 d ,使存在 K 个点,他们两两距离 d
    N50

    刚讲了最大团,发现这个就是找一个最小的 d ,使得存在 K 的团
    显然答案有单调性,二分答案,建图,发现这个图和二分图没关系,遂寄掉
    最大团中一定有两个最远的点,距离 =d ,因此我们不妨放弃二分答案,枚举这两个点 (i,j) ,说明 dis(i,x)dis(i,j)dis(j,x)dis(i,j) ,说明我们要找的点一定在以 i,j 为圆心的圆内(注意这里并不是充要条件),我们连接 (i,j) ,发现两个圆和直线往上的点是完全图,往下的点也是,而上下两两相连的点就有些 >d ,这个图的补图是一个二分图

Day5

10+60+35+10,rk18

T1 因为没有判范围所以完全炸掉了,10010,rk1rk18 ,难受

T1

题目要求的即为把 ai,aj,ak 依次拼起来 =P 的三元组对数。我们枚举 j ,在左右两边用桶找即可,复杂度 O(nlogP)

细节1: 不能有前导零

细节2: 判断数时不可以超过桶的范围

T2

对于 opt{R,U} 的部分分,我们发现只改一个点时,右上角的位置只会偏移一格,因此我们可以直接求前后缀后合并

对于 100% 的数据,合并是困难的,但修改反而是简单的,我们对于 opt 相同的点,我们在删掉他时,终点显然始终不变,我们用 map 存每个位置出现数个数,右移端点时只会加一个点删一个点,复杂度 O(nlogn)

T3

从左到右 考虑(注意这个思路不只是适用于 dp ,因此这题和组合数有一定关系) ,然后假设第 i 个礼物被选了 bi 次,答案为:

(nb1,b2,...,bK)=n!i=1k1bi!

根据 Lucas 定理, (nm)modp=(npmp)(nmodpmmodp)modp ,其中由于 p=2 ,因此我们就相当于让对于 n 二进制中值为 1 的每一位,从 2ia1,2ia2,...,2iak 中选一个数,使和为 m

我们考虑 dp ,设 dpi,j 表示前 i 位和为 j 方案数。我们发现这些数有几个性质:

  1. j2i+1ak ,这个显然
  2. jm(mod2i) ,因为我们从低到高位取数,后面的一定不会影响低位的答案,而令 j=m 的条件就是 jm(mod2i)

这两个性质有什么用呢?说明 j 只有 2i+1ak2i=2ak=O(ak) 种取值,因此我们记忆化搜索即可

最终复杂度 O(kAlogn)

T4

A,B 不互质,我们可以将图分成 gcd(A,B) 个独立的部分。接下来我们假设 A,B 互质

考虑将图的每个点放到二维平面上。对于二维平面上坐标为 (x,y) 的点,编号为 x(A+B)+(yAmod(A+B)) 。由于保证了 A, B 互质,每个点也唯一对应一个坐标。

于是:

uu+A 对应 (x,y)(x,(y+1)mod(A+B))(x,y)(x+1,(y+1)mod(A+B))

uu+B 对应 (x,y)(x,(y1)mod(A+B))(x,y)(x+1,(y1)mod(A+B))

uu+A+B 对应 (x,y)(x+1,y)

这是一个类似网格图的形式

考虑按 x 从小到大的顺序 DP(或直接按原图的标号顺序 DP),我们可以得到一个 O(2A+Bn) 的算法。

考虑按 y 从小到大的顺序 DP,由于 y=0 的点和 y=A+B1 的点之间也有连边,

我们需要额外枚举 y=0 的点的状态。我们可以得到一个 O(4nA+Bn) 的算法。

根号分治,时间复杂度 O(22nn),可以通过本题。

下午数学讲解

  • 1n 的素数个数为 O(nlnn)

  • MillerRabin 素性测试:对于测试的数 p ,每次选在 [2,p) 之间的随机数,根据费马小定理二次探测定理 判断
    费马小定理:若 p 为质数,a0(modp),则 ap1=1
    二次探测定理:若 p 为质数,则 x21(modp) 的解为 x=1,p1
    虽然这两个定理存在一些数在 p 不为质数时依然成立,但当两个方法结合一起时出现概率极低
    做法如下:

    1. p 是偶数或 1 直接判断。
    2. p 为大于 1 的奇数时,选取一个在区间 [2,p) 之间的随机数 a。
    3. 计算 ap1modp,不为 1 根据费马小定理直接判断 p 不是质数。
    4. p1 分解为 2tr 的形式,随机一个 a ,计算 a2tr (0 ≤ k ≤ t) (先计算 ar 再不断平方即可)。若在平方过程中发现一个不为 1p1 的数的平方为 1,则根据二次探测定理直接判断 p 不是质数。
    5. 若多次回到步骤 2 后还没有判断 p 不是质数,则认为 p 是质数。
  • PollardRho

    • 先用 MillerRabin 判素数,如果 p 不是质数,找一个因子 x ,递归分成 xpx
    • 简单的想法是随机一个 x ,暴力判断,期望 O(n)
    • 优化一下,如果 gcd(x,p)1 ,则也找到了,期望 O(n) ,比直接分解质因数还要慢
    • 考虑一个伪随机序列 x ,其中 xi+1xi2+c(modn) ,注意,如果不是这个随机序列,反而可能会更慢,目前没有严谨证明。
    • 因为这个随机数之和上一个数相关,因此很容易出现循环,循环期望长度为 O(n) ,证明根据生日悖论
    • pn 的最小质因子,显然 pn 。由于 p|n ,设 xi=ximodp ,显然 xi+1xi2+c(modp) ,期望循环长度 O(p)O(n14)
    • 找到一对数 a,b 满足 ab(modp)ab(modn) ,则取 gcd(ab,n)n 的因子
    • a,b 的过程可以用 floyd 判环算法 (注意和 floyd 没什么关系) ,让 a=xi,b=x2i ,每次让 a 走一步, b 走两步,由于存在循环, b 会在约循环节长度步后与 a 相等。当 ab 在模 p 意义下相等(同余),且在模 n 意义下不同时,即找到了符合条件的 a,b。若直到 a 与 b 在模 n 意义下相等时还没找到,则退出,重新选取 x1c 的值
    • 复杂度期望 O(n14logn) ,其中 logn 来自 gcd
    • 我们也可以把 log 给去掉。在 a,b 移动过程中,不需要每次都求一遍 gcd(ab,n),可以把 limab 的值乘起来,再一起与 ngcd。当然,乘起来之后为 0 要特判。
  • 质因数分解多个小范围数:欧拉筛处理最小质因子,复杂度 O(n+Qlogn)

  • exgcd 可以用归纳法证明 |x|a,|y|b ,因此不会爆 ll

  • 欧拉函数:

    1. n=d|nφ(n)
    2. φ(pk)=pkpk1=pk×fracp1p
    3. n=piki ,则 φ(n)=n×pi1pi
  • 光速幂:

    • 对于底数和模数相同的情况,我们可以用分块的技巧,按 s 分块,计算出 a1,a2,a3,...,as1,as,a2s,a3s,...,anss
  • 扩展欧拉定理:

    {abmodpb<φ(p) abmodφ(p)+φ(p)modpbφ(p)

    • 阶乘逆元:((n1)!)1=(n!)1×n
    • 递推逆元:把 p=ki+r ,显然有 ki+r0(modp)
      变形知 kir(modp)i1k×r1(modp),再把 k,r 真实的值带进去即可
  • 数论分块:

    • i=1nf(i)g(ni),若 f(i) 的前缀和可以快速计算,就数论分块
    • 考虑 ni 有很多重复,因此可以分成 O(n)
    • 右端点 r=nni
    • extra:也有 i=1nf(i)g(ni)h(mi) 的情况,复杂度 O(n+m) (注意是加法)
  • 原根:

    • 一个数 g ,满足 gp11(modp) ,而 g1,g2,...,gp21
    • 如果 gk1 ,则 k|p1 。感性理解一下,对于一个数 x=1 ,每次我们让他 ×g ,然后他就会一直在绕圈圈,最后绕到 1 ,因此环长一定是 p1 的因数
      求法没有听懂,好像要用 BSGSn 次剩余之类的高科技
    • 原根数量是 O(n14)
    • 例子:有多少个x 满足 xxa(modp)
      • 不会
  • 作业:

    • NOIP2012 同余方程
    • 洛谷 P1516 青蛙的约会
    • 洛谷 P2568 GCD
    • SDOI2012 Longge 的问题
    • TJOI2009 猜数字
    • SDOI2008 仪仗队
    • NOI2002 荒岛野人
    • CQOI2007 余数求和
    • 洛谷 P6583 回首过去
    • 洛谷 P4139 上帝与集合的正确用法
    • CF594D REQ
    • CF1202F You Are Given Some Letters...
    • NOI2018 屠龙勇士
  • 组合数:

    1. (nm)=(nnm)
    2. (nm)=nm(n1m1)
    3. (nm)=(n1m)+(n1m1)
    4. (rm)(mk)=(rk)(rkmk)
    5. i=0n(ni)=2n
    6. i=0ni(ni)=n2n1
    7. i=0ni2(ni)=i=0n(i(i1)+i)(ni)=n(n+1)2n2
    8. i=0n(2n+1i)=22n
    9. i=0n(im)=(n+1m+1)
    10. 范德蒙卷积(下指标卷积):i=0k(ni)(mki)=(n+mk)
      n=m=k时:i=0n(ni)(ni)=(2nn)
    11. 上指标卷积:i=0k(in)(kim)=(k+1n+m+1)
    12. 详情见这里
  • 生成函数:

    • 把一个序列变成一个函数,函数 F(x)=ankn(x) 。其中 kn(x) 为核函数。
    • kn(x)=xn 普通生成函数; kn(x)=xnx! 指数型生成函数
    • 一些对序列的变换可以用生成函数的运算表示,从而进行一些推到,达到优化复杂度的做法
    • 注意运算时要注意核函数相同
    • exampleCn=aibniC(x)=A(x)B(x)
      Cn=aibni(ni)Ce(x)=Ae(x)Be(x) ,其中 Ae(x) 为指数型生成函数
      计算 j=0k2kj(k+jj) 。(呃呃,老师讲不下去了)
  • n 点带标号 DAG 计数, n5×103

    先考虑一个 dp :设 dpi 表示有 i 个点的 DAG 的方案数。我们可以枚举所有度数为 0 的点,然后向别处连边

    但这个 dp 是错误的,因为我们发现如果我们某一次没有把度数为 0 的点全部钦定的话,那钦定 0 的度数的顺序会被多次计入答案。例子:

    2 1
    3 1
    

    其中 2 先连是一种方案, 1 先连是一种方案, 1,2 同时考虑也是一种方案
    多算了怎么办。我们有两种办法:

    1. 考虑在 dp 中多记录状态
    2. 考虑容斥原理

    此为后者
    我们考虑现在我们算的其实是钦定了 j 个点度数为 0 ,而我们想要恰好 度数为 0 ,因此我们只需要给这个 dp 乘上一个容斥系数即可。

    如果没有 1xim 的限制,显然插板子。有的话容斥,当钦定有 j 个板子超过时先把 m×j 先取出来即可,不要忘记乘上组合数 (nj) 和容斥系数
    extra:如果限制 ximi 的话,要 dp

  • # KEYENCE 2019 F Paper Cutting

    考虑第 k 次操作对答案的贡献:

    &k!(K - k)!\binom{H+W-k}{K-k} \sum_{i=0}^{k} \binom{H}{i} \binom{W}{ k - i} (i + 1) (k-i+1) \
    =&(k+1) \sum_{i=0}^{k} \binom{H}{i} \binom{W}{ k - i }+\sum_{i=0}^{k} i(k-i)\binom{H}{i} \binom{W}{ k - i } \
    =&(k+1)\binom{H+W}{k} + HW\binom{H+W-2}{k-2} \
    \end{align}

    复杂度 O(H+W)

  • AGC039

    假如我们知道每行最小值 ri 和每列 cj ,答案为:

    dpk,i,j 表示填了 ri,cj 中小于等于 k 的值,且已经填的行数为 i,列数为 j 时已填的位置对答案的贡献。
    转移需要枚举加入的不被容斥的行数、不被容斥的列数、容斥的行数、容斥的列数,一起枚举复杂度过高,只要依次枚举,分四次转移即可。
    复杂度 O(KNM(N+M))

posted @   FOX_konata  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示