那么车 $i$ 能在 $t'$ 时刻到达原点当且仅当 $t' \bmod 2^{e'_i} = d_i$。即如果 $t'$ 的二进制下第 $e'_i$ 位为 $d_i$ 则会对答案贡献 $w_i$。
那很简单了。把所有 $(d_i,e'_i)$ 的限制对插入 Trie 里,然后只需要找一条叶子到根的链使得其价值和最大即可。
:::success[Code]
```cpp line-numbers
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;
int n, m, a[N], v[N], w[N];
void exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
} else {
exgcd(b, a % b, y, x);
y -= a / b * x;
}
}
void work(int a, int &x, int b, int &y, int c) {
int g = __gcd(a, b);
exgcd(a, b, x, y);
x *= c / g, y *= c / g;
int dx = b / g, dy = a / g;
if (dx < 0) dx = -dx, dy = -dy;
int k;
if (x < 0) k = (-x + dx - 1) / dx;
else k = -x / dx;
x += dx * k, y -= dy * k;
}
int idx;
int tr[N * 60][2];
int res, sum[N * 60];
void dfs(int u, int s) {
s += sum[u];
res = max(res, s);
if (tr[u][0]) dfs(tr[u][0], s);
if (tr[u][1]) dfs(tr[u][1], s);
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; ++ i ) {
cin >> a[i] >> v[i] >> w[i];
a[i] = a[i] * (1ll << m);
}
m = 1ll << m + m;
for (int i = 1; i <= n; ++ i ) {
int d, _;
work(v[i], d, -m, _, -a[i]);
int e = m / (v[i] & -v[i]);
int k = __builtin_ctzll(e);
int p = 0;
for (int i = 0; i < k; ++ i ) {
int w = d >> i & 1;
if (!tr[p][w]) tr[p][w] = ++ idx;
p = tr[p][w];
}
sum[p] += w[i];
}
dfs(0, 0);
cout << res;
return 0;
}
```