首页 > 其他分享 >【2023.7.22/HAOI2018】渺小如褐蚁也只能蓄力一搏,企图撼动命运的终末

【2023.7.22/HAOI2018】渺小如褐蚁也只能蓄力一搏,企图撼动命运的终末

时间:2023-07-22 17:55:13浏览次数:43  
标签:如褐蚁 cnt gcd 22 复杂度 times 2023.7 mathcal mathrm

奇怪的背包

首先一个物品 \(v\) 能做的贡献是 \(k\times \gcd(v,P)\),所以一开始 \(v\gets \gcd(v,P)\)。

感觉很神秘啊,复杂度估计是个 \(\mathcal O(n+m+\sqrt P)\) 或者 \(\mathcal O(n\ln P)\) 或者 \(\mathcal O(n\pi(P)),\mathcal O(nd(P))\) 状物。

枚举一下做法。关注一下特殊元素,注意到 \(v=1\) 的话非常棒啊,你再选一个 \(d\),用 \(1\) 填 \(w-d\),再塞一个 \(d\) 就行。

发现这个东西好像和序列没啥关系,那我放到值域上。其实 \(v\) 的元素都是 \(P\) 的因数,那就 \(d(P)\le 10^3\) 个,这样就凑出来 \(d(P)\) 了!是不是可以 \(\mathcal O(nd(P))\)!

有 \(v=1\) 的话显然随便选,记 \(v=1\) 的有 \(cnt\) 个,那答案就是 \(2^{n-cnt}\times (2^{cnt}-1)\)。

没有 \(v=1\) 时特殊考虑,小凯的疑惑有结论 \(a\times b - a - b\),但是我好像不太会用。很有感觉,但搞不出来,水平不是很够。其实感觉这里已经可以阈值分治乱搞过了,但不会,菜。

看题解。

为啥 \(x,y\) 能凑出 \(\gcd(x,y)\) 啊。沃趣忘了是总重量对 \(P\) 取模,shaber。

那就简单了啊,只要选出的 gcd 是 \(w\) 的因数即可。 \(f(i,j)\) 表示考虑前 \(i\) 个 \(P\) 的约数,选出来 gcd 为 \(a_j\) 的方案数。\(f(i,j)=f(i-1,j)+\sum\limits_{k,\gcd(a_k,a_i)=a_j} f(i-1,k)\times (2^{cnt_i}-1)\)。

时间复杂度 \(\mathcal O(qd(n)+\sqrt P)\),过不去啊。咋办。看题解。

哦,有用的只有 \(\gcd(P,w)\) 的约数,这样就可以预处理了,\(\mathcal O(d^2(P)\log d(P)+\sqrt P)\)。这么 trivial 怎么没想到?

反色游戏

不会这个题呜呜,看题解了。

从整张图入手,有两种方法可以得出这道题的结论:

  • 高斯消元:把矩阵列出来,不难发现矩阵的秩为 \(n-1\),那么方案数即为 \(2^{m-n+1}\)。
  • 构造法:我们考虑一棵树。根据经典的剥叶子型构造手法,我们可以得出一棵树的时候方案数唯一,除非要求 \(1\) 的点数为奇数,那样状态异或和为 \(1\),而我们的操作状态异或和始终为 \(0\),所以构造不出来。反之我们随便抽出来一棵生成树,对于其它边,显然取或不取只会反转两个点的状态,而我们的构造法永远可以构造出唯一解,所以方案数就是 \(2^{m-n+1}\)。

然后我们考虑这个原问题。图上就那么几个知识点,这题又和割点强相关,那就考虑广义圆方树。

假设一开始有 \(\rm cnt\) 个连通块,\(i\) 有 \(\mathrm{deg}_i\) 条连边,和 \(\mathrm{cut}_i\) 个方点相连,并且 \(i\) 断开后没有一个连通块内有奇点,那么方案数就是 \(2^{m-n-\mathrm{deg}_i+\mathrm{cnt}+1+\mathrm{cut}_i}\)。时间复杂度 \(\mathcal O(Tn)\)。甚至不用显式地建出来圆方树,因为我们只需要 \(\rm sz\) 和 \(\rm cut\) 两个数组,直接求割点就行。

字串覆盖

两年前的我这么强吗,还会写 30pts,现在的我 30pts 都写不出来。这种字符串工业太可怕了!

好吧,其实做法的提示性很强,这个东西明摆着是让你根号分治的。难点在于维护而不在于贪心。

我先口胡一个东西看看对不对啊。跑 SA,设阈值是 \(B\),然后 \(\gt B\) 的直接二分出来 \(\rm sa\) 范围,然后扔主席树上不停进行区间查询时间复杂度是 \(\mathcal O(\frac{nq}{B}\log n)\) 的一个东西。然后 \(\le B\) 的子串只有 \(\Theta(nB)\) 个。怎么预处理来着?

哦好像题目里规定了 \(\le B\) 的很少,\(r-l\) 随机均匀这个性质咋用?是想告诉我默认 \(\tilde O(r-l)=1000\) 吗?

那我是不是还是可以和上面那个东西一样暴力跑啊 /qd。

看一眼 myee 的题解,好像还真行,\(X=50,Y=2000\) 的话这个东西的复杂度就是

\[\mathcal O(\frac{\log n}{Y-X}\int_X^Y \frac{n}{x}\, \mathrm d x) = \mathcal O(n\log n\frac{\ln Y - \ln X}{Y-X}) \]

我不会微积分啊,这个式子是抄的。写完这个一定要学一学微积分,要不然这种细致复杂度分析不会做 /ng。(学不会,开摆)

好像还有 \(r-l\le X\) 的情况,这个咋办来着。

一般来说字符串这种东西可以反着来,想一想出题人会怎么卡。他要卡我的话肯定能匹配的越多越好,那这样的话询问的本质不同串是不是不会多。

看题解。好吧,首先按上面的方法找到第一个位置,然后倍增预处理就行。不想写代码,啥时候闲的蛋疼了再写。

苹果树

非常暴力的组合数计数。

考虑拆贡献,对 \(i\) 节点,我们枚举 \(k = sz_i\),计算 \(i\) 子树大小为 \(k\) 的方案数,然后直接暴力乘起来。

\(i\) 子树内的方案数是 \((k - 1)!\times \binom{n - i}{k - 1}\),表示 \(\gt i\) 的树中选 \(k - 1\) 个进行排列,然后 \(i\) 子树外的方案数是 \(i!\times (i + 1 - 2)\times (i + 2 - 2)\dots \times (n - k + 1 - 2) = i\times (i - 1)\times (n - k - 1)!\)。

那么 \(i\) 的方案数就是 \(\sum_{k=1}^{n-i+1} k\times (n - k)\times (k - 1)!\times \binom{n - i}{k - 1}\times i\times (i-1) \times (n - k - 1)!\)

事实上,还有另外一种拆贡献方式,这也更符合拆贡献的本源的定义。学习自 myee。

考虑一个 dp,设 \(f_n\) 表示 \(n\) 个点的树,到根节点的距离和。

枚举左子树大小 \(i\),显然有:

\[f_n = \sum\limits_{i = 0}^{n-1} \binom{n-1}{i}f_i\times (n - i - 1)!+f_{n-i-1}\times (n-i-1)! + (i + n - i - 1)\times i!\times (n-i-1)! \]

然后设答案为 \(g_n\),则有:

\[g_n = \sum\limits_{i = 0}^{n - 1} g_i\times (n - i - 1)! + g_{n - i - 1}\times i! + (n - i - 1)!\times (n - i - 1)\times (f_i + i!\times i) + i!\times i\times (f_{n - i - 1} + (n - i - 1)!\times (n - i - 1)) \]

然后就可以 \(\mathcal O(n^2)\) 递推了。

这道题体现的是一种拆贡献的思想。首先,子树问题的刻画方式是枚举其中一棵子树的关键信息,这道题就是左子树的大小,然后两棵子树之间的贡献可以通过拆贡献,分开来计算。

方案数

当时的 markdown 源文件找不到了,不放了。反正 NTT 现在又不考,会二项式反演就行。

标签:如褐蚁,cnt,gcd,22,复杂度,times,2023.7,mathcal,mathrm
From: https://www.cnblogs.com/Royaka/p/17573804.html

相关文章

  • 2023-07-22 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(七).md
    2023-07-22《数值优化方法》-庞丽萍,肖现涛-无约束最优化(七)数值优化方法Matlab牛顿法在前面我们研究了共轭方向法和共轭梯度法,两种方法都有二次终止性,那么是否可以在每次迭代的时候都用一个二次函数去近似目标函数呢?这就是牛顿法的基本思想。我们知道函数在处的二阶泰勒展开式为......
  • 7/22·afternoon
    1272:【例9.16】分组背包  http://ybt.ssoier.cn:8088/problem_show.php?pid=1272#include<bits/stdc++.h>usingnamespacestd;structqwert{intw,v;}a[13][31];intV,N,T;intcnt[13],f[203];intmain(){cin>>V>>N>>T;for(inti=1......
  • 7.22做题记录
    1//树状数组单点修改和区间查询2#include<bits/stdc++.h>3usingnamespacestd;4intn,m,f[1000005];5intlowbit(intx)6{7returnx&-x;8}9voidadd(intx,intk)10{11while(x<=n)12{13f[x]+=k;14x+=lowb......
  • 2023.7.22-假期周进度报告
    本周(7.16-7.22)主要学习大数据相关的最基本知识。下周准备进行休息。周日,进行VMware的下载和虚拟机镜像的下载和安装,完成了VMware的下载和安装,虚拟机的下载和安装,VMnet8虚拟网卡的基本配置,虚拟机主机名和ip地址的配置,遇到了虚拟机镜像下载慢的问题,解决方法是从所看课程中给的资料......
  • 2023/7/22(2)宽搜练习马走日
     #include<bits/stdc++.h>usingnamespacestd;intqwq[12][2]={{1,2},{1,-2},{-1,2},{-1,-2},{-2,-1},{-2,1},{2,1},{2,-1},{2,2},{-2,-2},{2,-2},{-2,2}};intax,ay,bx,by;boolmp[105][105];structnode{intx,y,step;node(){}node(constint......
  • 230722 做题记录 // 网络流二十四题 (1/24)
    知耻而后勇,物极必反。A.星际转移问题http://222.180.160.110:1024/contest/3952/problem/1如果就按照题目给的路线图,我们显然无法考虑到飞船到达的时刻。同时\(n\)和\(m\)又很小,我们就知道了,「人不能两次踏进同一条河流」,1时刻的站\(p\)和2时刻的站\(p\)也不能是......
  • 总结2023-07-22
    求两个数的最小公倍数解题思路,两个数的乘积除以两个数的最大公约数为最小公倍数//packagePTACZW;importjava.util.Scanner;importjava.math.BigInteger;publicclassMain{publicstaticvoidmain(String[]args){Scannerinput=newScanner(Syst......
  • 7/22上午
    1212LETTERShttp://ybt.ssoier.cn:8088/problem_show.php?pid=1212#include<bits/stdc++.h>usingnamespacestd;intmaxs=0;boola[25][25],b[10005];charc[25][25];intR,S;intx[4]={1,0,-1,0};inty[4]={0,1,0,-1};voiddfs(intm,intn,ints){......
  • 7/22·morning
    1269:【例9.13】庆功会  http://ybt.ssoier.cn:8088/problem_show.php?pid=1269#include<bits/stdc++.h>usingnamespacestd;intn,m;intw[503],v[503],s[503];intdp[6007];intmain(){cin>>n>>m;for(inti=1;i<=n;i++){cin>&......
  • 2023.7.21
    今天和室友约好早起去跑步了五点半起床 !体验了一下早起的世界,其实外面当时天已经亮了,而且路上已经有了很多人然后和室友打着语音一边唠嗑一边慢跑其实还是蛮开心的,虽然起床很痛苦……明天继续!......