一些姿势

( ext{Point 1})

可以用 memset(f,192,sizeof f) 来给 ( ext{long long}) 极小值赋值,它的两倍也不会爆。

( ext{Point 2})

求二进制中 (1) 的个数。

方法壹

__builtin_popcount(x),头文件 #include <cstdio>

方法贰

递推有 rep(i,1,n) bit[i]=bit[i-(i&-i)]+1;

( ext{Point 3})

二进制枚举子集,假设 (lim) 的二进制有 (n) 位。

for(int s=0;s<=lim;++s)
    for(int i=s;i;i=(i-1)&s)

每次都在减小,而 &s 保证了一定是子集,故正确。

关于时间复杂度就是 (mathcal O(3^n))

首先对于有 (i)(1) 的数,因为枚举是只枚举子集且只枚举一次,时间复杂度就是 (1) 可以变成 (1/0)(mathcal O(2^i))

而我们有 (C_n^i) 个这样的数,总时间复杂度为 (mathcal O(sum_{i=0}^n C_n^i imes 2^i imes 1^{n-i})=mathcal O(3^n))

( ext{Point 4})

这样好像会快一点。

inline int mul(const int x,const int y) {return 1ll*x*y-1ll*x*y/mod*mod;}

( ext{Point 5})

快速判断一个数是否为 (2) 的幂。即 ((x-1)&x)=0

原文地址:https://www.cnblogs.com/AWhiteWall/p/12336085.html