- 中途相遇法:在一个序列中找到某特定元素(如只出现一次的元素),如果单从一边开始扫则最差复杂度o(n),如果从头和尾同时找,则最坏情况为中间相遇o(n/2),递归时可以起到加速效果。
- (ll)1<<54或1ll<<54才不会溢出.
- 状压dp中枚举子集,S0为原集。
for(int S=S0;S;S=(S-1)&S0) { //其他代码 }
- 有时枚举可以猜想一下是否单调或只有一个极值,这样可以使用二分法或三分法。
- n!质因数分解,i为小于n的素数,n!因子中i的个数为n/i+n/i^2+……n/i ^x(i ^x<=n).
- 一个环含k个点,从一点出发以步长为l走,最终走回出发点,S为经过的点的集合,S中包含k/gcd(l+k)个点,若gcd(l1,k)==gcd(l2,k),S内包含点相同。
- 解决lca问题倍增法,dfs序st表法。。。
- 倍增还可以解决找第一个权值大于自己的祖先,到其祖先共有多少权值大于自己的点(预处理一下),暴力找祖先可以考虑一下倍增。
- 一个数(x>1)要么是素数,要么可以写成一个小于等于sqrt(x)的素数乘以一个大于等于sqrt(x)的数。
- 不上升子序列的最小划分数等于最长上升子序列长度
不下降子序列的最小划分数等于最长下降子序列长度 - !a^!b=a ^b。!a ^ b=a ^!b=!(a ^b)
- 一个数n在m进制下末尾0的个数,等于该数因子中有多少个m,把m质因数分解,在求出n中有多少个这些质数因子与m中对应素数因子的个数一一相除,取最小即可。n!也可求,借助阶乘质因数分解。
待续