首先,如果你的分数 < 65pts,先检查时间复杂度。
然后是 >= 65pts 的优化方法:
- 求逆元的时候,用
__gnu_pbds::gp_hash_table
记忆化(会计算很多重复数逆元)
- 优化取模:
const __int128 _base = (((__int128)(1)) << 64) / mod;
inline int fastmod(long long x){return (int)(x-mod*(_base*x>>64));}
int Add(int x, int y){ return (x + y) >= mod ? (x + y - mod) : (x + y); }
int Mul(int x, int y){ return fastmod(1ll * x * y); }
- 快读快输
register
和 C++ 98
- 多用
memset
/ memcpy
,这两个玩意会调用 SIMD 指令提高速度。
- FWT 的时候,不要用 op 去乘,而是用简单加减替代:
int op1(int x){ return x; }
int op2(int x){ return mod - x; }
std::tr1::function<int(int)> opize = (op == 1) ? op1 : op2;
- 适当调整数组的下标,保证缓存命中率。具体来说,下标连续变化的放到最后,大部分时刻不会变化的放到前面。
- 不要开
long long
不保证上述都有很大效果,但至少加起来可以通过本题。
话说 2022 省选考了这道题的应该是很噩梦吧