結果
| 問題 | No.3554 Rurumaru Function Problem 2 |
| コンテスト | |
| ユーザー |
ぽえ
|
| 提出日時 | 2026-05-22 19:58:14 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 12 ms / 2,000 ms |
| コード長 | 1,851 bytes |
| 記録 | |
| コンパイル時間 | 3,513 ms |
| コンパイル使用メモリ | 335,560 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-22 21:50:10 |
| 合計ジャッジ時間 | 6,272 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge1_0 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for (ll i=0; i<(ll)(n); i++)
vector<ll> a;
ll h(ll n, ll v) {
if (n == 0) return 0;
ll m = n - 1;
array<array<ll, 2>, 2> dp{}, ndp{};
dp[0][0] = 1;
for (ll d=60; 0<=d; d--) {
rep(fx, 2) rep(fy, 2) ndp[fx][fy] = 0;
ll bm = (m >> d) & 1;
ll bv = (v >> d) & 1;
rep(fx, 2) {
rep(fy, 2) if (dp[fx][fy] != 0) {
rep(bx, 2) {
rep(by, 2) {
if (fx==0 && bm<bx) continue;
if (fy==0 && bm<by) continue;
bool ok = false;
if (d&1) {
if ((bx|by) == bv) ok = true;
} else {
if ((bx&by) == bv) ok = true;
}
if (!ok) continue;
ll nfx = fx || (bx<bm);
ll nfy = fy || (by<bm);
ndp[nfx][nfy] += dp[fx][fy];
}
}
}
}
dp = ndp;
}
ll re = 0;
rep(fx, 2) rep(fy, 2) re += dp[fx][fy];
return re;
}
ll g(ll x) {
ll best = -1;
ll best_v = 0;
for (auto& v : a) {
ll cur = h(x, v);
if (best<cur || (cur==best && v<best_v)) {
best = cur;
best_v = v;
}
}
return best_v;
}
int main() {
ll n; cin >> n;
a.resize(31); a[0] = 0;
rep(d, 30) a[d+1] = 4 * a[d] + 2;
ll ans = 0;
ll p = 1;
rep(k, 30) {
ll l = p, r = n + 1;
while (1 < r - l) {
ll m = (r - l) / 2 + l;
if (g(m) < a[k+1]) l = m;
else r = m;
}
ans += (r - p) * a[k];
p = r;
}
cout << ans << endl;
}
ぽえ