CF1815D
诈骗。
核心:万能的性质:异或是不进位加法
考虑 \(m>2\),对于和 \(n\) 同奇偶的 \(x\) 我们直接构造 \(\left\{x, \cfrac{n-x}{2}, \cfrac{n-x}{2}, 0, \cdots \right\}\),对于不同奇偶我们发现这么多东西加起来,进位一定从第二位开始进,所以所有的进位都是偶数。因此不可能同奇偶。
对于 \(m = 1\),只能等于 \(n\)。
对于 \(m = 2\),我们考虑数位 DP 构造,从低位到高位,\(f_{i,0/1}\) 表示当前到了第 \(i\) 位,这一位有没有进位,异或之和,\(g_{i,0/1}\) 表示异或的个数。
直接转移即可。
Mint f[65][2], g[65][2], pw[65];
void work() {
cin >> n >> m;
if (m > 2) {
__int128 p = n;
cout << (int)(((p + (p & 1)) * (p / 2 + 1) / 2) % MOD) << endl;
} else if (m == 1) {
cout << n % MOD << endl;
} else {
memset(f, 0, sizeof f);
if (ck(n, 0)) {
f[0][0] = 1;
g[0][0] = 1;
f[0][1] = 0;
g[0][1] = 0;
} else {
f[0][0] = 0;
g[0][0] = 1;
f[0][1] = 0;
g[0][1] = 1;
}
rep (i, 1, 60) {
if (ck(n, i)) {
f[i][0] = (pw[i] * g[i - 1][0] + f[i - 1][0]) + f[i - 1][1];
f[i][1] = f[i - 1][1];
g[i][0] = g[i - 1][1] + g[i - 1][0];
g[i][1] = g[i - 1][1];
} else {
f[i][0] = f[i - 1][0];
f[i][1] = f[i - 1][0] + f[i - 1][1] + pw[i] * g[i - 1][1];
g[i][0] = g[i - 1][0];
g[i][1] = g[i - 1][0] + g[i - 1][1];
}
}
cout << f[60][0] << endl;
}
}

浙公网安备 33010602011771号