杂题选放

Posted Hs-black

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂题选放相关的知识,希望对你有一定的参考价值。

提示:点击解题思路即可展开。

UOJ62「UR #5」怎样跑得更快

题目大意

给定整数 \\(n,c,d\\) 和个长度为 \\(n\\) 的数组 \\(b[]\\),求另一个数组 \\(x[]\\),对于 \\(P=998244353\\),满足

\\[\\sum_{j=1}^n\\gcd(i,j)^c\\times lcm(i,j)^d\\times x_j=b_i \\pmod P \\]

数据范围

\\[1 \\le n \\le 10^5 \\]

解题思路

先说题解给出的解法,首先一步转化

\\[\\sum_{j=1}^n\\gcd(i,j)^{c-d}\\times \\frac{x_j}{j^d}=\\frac{b_i}{i^d} \\pmod P\\\\ \\sum_{j=1}^n\\gcd(i,j)^{c-d} X_j=B_i \\pmod P\\\\ \\]

第一波直接设 \\(f(n)=\\sum_{d|n}f_r(d)\\) 这样 \\(f_r(n)=f(n)-\\sum_{d|n\\and d \\neq n}f_r(d)\\) 是可以 \\(\\Theta(n\\log n)\\) 求的。然后推一波式。

\\[\\sum_{j=1}^nf(\\gcd(i,j))X_j=B_i\\\\ \\sum_{j=1}^n\\sum_{d|i,d|j}f_r(d)X_j=B_i\\\\ \\sum_{d|i}f_r(d)\\sum_{j=kd}X_j=B_i\\\\ \\sum_{d|i}f_r(d)S(d)=B_i\\\\ \\]

可以算得 \\(f_r(n)S(n)=B_n-\\sum_{d|n\\and d \\neq n}{f_r(d)S(d)}\\)

因为 \\(f_r(n)\\) 有可能等于 0,这时候判一下无解或多解,这样我们就把 \\(S(n)\\) 全算出来了。

然后考虑解出 \\(X_j\\),有 \\(S(d)=\\sum_{i=kd}^{n}X_i\\),所以 \\(X_d=S(d)-\\sum_{i=(k+1)d}^{n}X_i\\)

然后就做完啦,容易发现这里一共用了三次莫比乌斯反演!


CF232C Doe Graphs

题目大意

递归的定义一个 \\(n\\) 阶无向图 \\(D(n)\\),边权均为 1

  • \\(D(0)\\) 由节点 1 构成
  • \\(D(1)\\) 由节点 1, 2 和边 (1, 2) 构成
  • \\(D(n)\\) 以如下方式构造
    • \\(D(n-2)\\) 的中的点编号都加上 \\(|D(n-1)|\\)
    • 在点 \\(|D(n-1)|\\) 和点 \\(|D(n-1)|+1\\) 之间连边。
    • 在点 \\(|D(n-1)|+1\\) 和点 1 之间连边

对于 n 阶无向图 \\(D(n)\\) 多次询问求出点 \\(x, y\\) 之间的最短路

img

数据范围

\\[1 \\le n, q \\le 10^5\\\\ 1 \\le x ,y \\le 10^{16} \\]

解题思路

情况一:a 在左部图,b 在右部图

img

首先观察发现 \\(|D(n-1)|+1\\) 事这个图的割点,也就是说左边到右边一定要经过这个点,所以递归去做

\\[Dis(a,b,n)=\\min(Dis(1,a,n-1),Dis(a,|D(n-1)|,n-1))+Dis(1,B-|D(n-1)|,n-2) \\]

情况二:a,b 均在右部图

容易发现 \\(Dis(a,b,n)=Dis(a-|D(n-1)|,b-|D(n-1)|,n-2)\\)

情况三:a,b 均在左部图

img

容易发现要么直接从 a 走到 b,否则有可能到 \\(|D(n-1)+1|\\) 这个点汇集,有

\\[Dis(a,b,n)=\\min\\left\\{ \\begin{matrix} Dis(a,b,n-1)\\\\ Dis(1,a,n-1)+Dis(b,|D(n-1)|,n-1)+2\\\\ Dis(1,b,n-1)+Dis(a,|D(n-1)|,n-1)+2\\\\ \\end{matrix}\\right. \\]

这样就可以递归着做了,然而我们还是发现第三种情况分生出的太多,\\(\\log\\) 的时间内事不行的,但考虑到 n 的大小事 \\(\\log\\) 的,另外算的 \\(Dis\\) 值大多与 \\(1,|D(n)|\\) 相关。

所以我们预处理出,\\(A1[n] = Dis(1,a,n),A2[n]=Dis(a,|D(n)|,n)\\),对于 b 类似,这样就没有那么多分支了。

预处理的过程和上面三种情况一致,注意还要处理 \\(g[n] = Dis(1,|D(n)|,n)\\),递推式为 \\(g[n] = g[n-2]+1\\)


CF1310 Au Pont Rouge

题目大意

给出一个长度为 \\(n\\) 的字符串 \\(S\\) 以及整数 \\(m,k\\)

对于一个把 \\(S\\) 分割成非空的 \\(m\\) 段的一个方案,我们用这个方案中分割出的字典序最小的一个串代表这个分割方案。

eg. \\(S=abaabb,m=3\\),存在分割方案 \\(\\{ab,aab,b\\}\\),则我们用字典序最小的 \\(aab\\) 来代表这个分割方案。

现在把所有分割方案对应的代表该方案的串按字典序从大到小排序,求排序后的第 \\(k\\) 个串。

数据范围

$ 2 \\le n \\le 1,000,1 \\le m \\le 1,000, 1 \\le k \\le 10^{18} $

解题思路

第 k 大肯定能想到二分,我们把它的所有子串按字典序排序,然后二分第 k 个串是什么,然后 dp \\(\\Theta(n^2)\\) 算出方案数即可。

难点大概在 dp 上,设 \\(dp[x][y]\\) 表示前 x 个位置,划分了 y 个字典序大于二分串,且第 x 个位置处一定被划分的方案数,容易发现这样事 \\(\\Theta(n^3)\\)的,有没有复杂度更低的方法呢?

考虑倒着 dp,\\(dp[x][y]\\) 表示考虑了 \\(x\\text~n\\),恰好划分了 m 段的方案数,\\(fp[x][y]\\) 表示考虑了 \\(x\\text~ n\\),已经划分了 m 段的方案数,设 t 表示 \\(s[x\\dots t]\\) 字典序恰好大于二分串的位置,那么转移为

\\[dp[x][y] = d[t][y-1]\\\\ d[x][y] = dp[x][y]+d[x+1][y] \\]

是不是非常简单

以上是关于杂题选放的主要内容,如果未能解决你的问题,请参考以下文章

图论杂题选做

11.28杂题选讲

正睿OI DAY3 杂题选讲

「总结」杂题选讲

杂题选讲

20190915杂题选讲