技巧记录

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

待续

发布了23 篇原创文章 · 获赞 0 · 访问量 326

猜你喜欢

转载自blog.csdn.net/qq_45753808/article/details/104710541