( 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
。