关于卡常
  • 板块学术版
  • 楼主LargeRice16pro
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/7/29 22:09
  • 上次更新2025/7/30 11:30:16
查看原帖
关于卡常
225100
LargeRice16pro楼主2025/7/29 22:09

在取模的时候,通常会写 ans = (ans + v) % mod,但是 % 取模太慢了。

有的时候会使用 ans += v % mod , if(ans >= mod) ans -= mod 的方式取模。

并且实测确实在 hd多校 3 的 1001 快了整整 2s(远超我的想象)

但是在 NC多校 5 的 K,使用上述方式,反而把 1200 ms “优化”成了 1800 ms,是为什么?

具体代码如下:

for (int i = 1; i < (1 << m); i++)
        dp1[i] = 23;
    dp1[0] = 0, dp2[0] = 1;
    for (auto u : sec) {
        for (int i = 0; i < (1 << m); i++) {
            int res = (i | u);
            if (dp1[i] + 1 < dp1[res]) {
                dp1[res] = dp1[i] + 1;
                dp2[res] = dp2[i] * cnt[u] % mod;
            } else if (dp1[i] + 1 == dp1[res]) {
                dp2[res] += dp2[i] * cnt[u] % mod;
//                 dp2[res] %= mod;
                if (dp2[res] >= mod)
                    dp2[res] -= mod;
            }
        }
    }
2025/7/29 22:09
加载中...