:::info[Description] Link. :::
:::infoSolution
未检测到题目。
打个表可以发现 的值就是把 在二进制意义下翻转得到的值。因此直接数位 dp 求 中有多少个数在二进制意义下是回文数即可。这个甚至都不需要数位 dp,直接按位模拟即可。
需要写高精度。 :::
:::success[Code]
namespace lowspeed_song {
inline void init() {
}
int a[N], b[N], ne[N];
inline void sol() {
bigint m; cin >> m;
bigint x = m, ans = 0, cnt = 1, p = 0;
vector<int> s;
while (!x.isZero()) {
auto [q, r] = bigint::divmod(x, 2);
s.emplace_back(r == 1), x = q;
}
reverse(s.begin(), s.end());
int n = s.size();
for (int len = 1; len < n; len++) {
ans += cnt;
if (~len & 1) cnt = cnt.mulInt(2);
}
for (int i = 0; i < (n + 1) / 2; i++) p = p.mulInt(2) + s[i];
ans += p - cnt;
vector<int> t = s;
for (int i = 0; i < n / 2; i++) t[n - i - 1] = t[i];
if (t <= s) ans += 1;
cout << ans << '\n';
}
} // namespace lowspeed_song:::
难度:青
鲜活指数:-20
喜欢的话,留下你的评论吧~