马上初赛了,假装准备一下.
主定理
假设有递推关系式 T(n)=aT(nb)+f(n) .
三种情况分别对应了 f(n)=O(nd) 的 d 较小,适中,与较大的情况.
Case 1
若 f(n)=O(nlogba−ϵ),ϵ>0 ,则 T(n)=Θ(nlogba) .
此时复杂度由 a,b 决定.
Case 2
若 f(n)=Θ(nlogbalogkn) ,则 T(n)=Θ(nlogbalogk+1n) .
此时两者均衡,复杂度在共同决定的基础上还要乘上一个 logn .
Case 3
若 f(n)=Ω(nlogba+ϵ),ϵ>0 ,对于某个常数 c<1 和所有充分大的 n 有 af(nb)<cf(n) ,则 T(n)=Θ(f(n)) .
此时复杂度由 f(n) 决定.
例一
若某算法的计算时间表示为递推关系式 T(n)=2T(n2)+nlogn,T(1)=1 ,求解该算法的时间复杂度.
观察发现是 Case 2 ,其中 a=b=2,k=1 .
于是时间复杂度为 T(n)=Θ(nlog2n) .
例二
若某算法的计算时间表示为递推关系式 T(n)=2T(n4)+√n,T(1)=1 ,求解该算法的时间复杂度.
观察发现是 Case 2 ,其中 a=2,b=4,k=0 .
于是时间复杂度为 T(n)=Θ(√nlogn) .
例三
若某算法的计算时间表示为递推关系式 T(n)=9T(n3)+n,T(1)=1 ,求解该算法的时间复杂度.
观察发现是 Case 1 ,其中 a=9,b=3 .
于是时间复杂度为 T(n)=Θ(n2) .
例四
若某算法的计算时间表示为递推关系式 T(n)=T(n2)+n,T(1)=1 ,求解该算法的时间复杂度.
观察发现是 Case 3 ,其中 a=1,b=2 ,常数 c 可取 (12,1) 中的任意实数.
于是时间复杂度为 T(n)=Θ(n) .
杂题整理
NOIP2018 提高组初赛 T17
求出当 a,b 都取 [0,31] 中的整数时,方程 a*b = (a or b) * (a and b)
一共有多少组解.
首先可以注意到 (a or b) + (a and b) = a + b
.
证明方式是把每个二进制位分开考虑.
若两个都是 1 ,贡献为 2 ,只有一个 1 ,贡献为 1 ,都是 0 ,贡献为 0 ,不难发现等式两边都满足以上性质.
记 x = (a or b),y = (a and b)
,则有 a+b=x+y,ab=xy .
而 x≥y ,所以只可能是 x=max(a,b),y=min(a,b) .
那么也就是求满足 (a and b) = b
或者 (a and b) = a
的数对个数.
先假设 a>b ,求出答案后 ×2 ,再加上 a=b 的 32 组解,就是答案.
枚举 a 有几个二进制位是 1 即可求出 a>b 部分的答案.
ans=32+2×5∑i=0(5i)⋅(2i−1)=454
NOIP2017 提高组初赛 T8
求出由 4 个有标号的点构成的无向简单连通图的数目.
这个就是 bzoj 3456 城市规划 ,于是可以手算 NTT .
用那个暴力 dp 手算一下.
设 f(i) 表示 i 个有标号的点构成的无向简单连通图的数目,边界有 f(1)=1 .
转移时用所有图的数目减去不连通的图的数目,
为了计算不连通的图的数目,可以枚举 1 号点所在连通块的大小为 j .
其它的点内部任意连边,但不与这个连通块内的点连边,这样就不连通了.
f(i)=2(i2)−i−1∑j=1(i−1j−1)⋅f(j)⋅2(i−j2)前 3 项可以口算, f(1)=1,f(2)=1,f(3)=4 ,代入得到 f(4)=38 .
NOIP2017 提高组初赛 T9
将 7 个名额分给 4 个不同的班级,允许有的班级没有名额,求分配方案的数目.
设 f(i,j) 表示 i 个班级分 j 个名额的方案数.
转移时枚举最后一个班级得到了 k 个名额.
f(i,j)=j∑k=0f(i−1,j−k)用前缀和优化一下,得到 f(i,j)=f(i,j−1)+f(i−1,j) ,边界有 f(i,0)=1,f(0,j)=0 .
这等价于从 (1,0) 出发,每次向右或向上走一步,走到 (4,7) 的方案数.
则答案为 (4−1+74−1)=120 .
NOIP2017 提高组初赛 T22
删除一条细边代价是 1 ,删除一条粗边代价是 2 .
需要以最小的代价使得 A 与 B 不连通,求出这个代价,以及有多少种删边方案的代价是最小的.
平面图转对偶图,对偶图中的最短路长度以及最短路数目就是答案.
Gitalking ...