結果
| 問題 | No.3416 マッチ棒パズル Extra |
| コンテスト | |
| ユーザー |
遭難者
|
| 提出日時 | 2025-12-23 01:25:54 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,551 bytes |
| 記録 | |
| コンパイル時間 | 5,923 ms |
| コンパイル使用メモリ | 336,332 KB |
| 実行使用メモリ | 20,128 KB |
| 最終ジャッジ日時 | 2025-12-23 01:26:09 |
| 合計ジャッジ時間 | 14,479 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 1 -- * 25 |
ソースコード
// https://atcoder.jp/contests/abc230/submissions/60477016
#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); i--)
using ll = int64_t;
using i128 = __int128_t;
using mint = atcoder::modint998244353;
mint solve(ll n) {
const mint two_inv = mint(2).inv();
ll SQ = sqrtl(n), CB = cbrtl(n);
ll x = n / SQ, y = SQ + 1;
mint ret = 0;
using P = pair<ll, ll>;
stack<P> sbt({{1, 0}, {1, 1}});
auto inside = [&](ll x, ll y) {
return y != 0 && x > n / y;
};
auto cut = [&](ll x, P p) {
return i128(n) * p.first <= i128(x) * x * p.second;
};
for (;;) {
auto [dx1, dy1] = sbt.top();
sbt.pop();
while (inside(x + dx1, y - dy1)) {
ret += x * (mint)dy1 + (dy1 + 1) * (mint)(dx1 - 1) * two_inv;
x += dx1, y -= dy1;
}
if (y <= CB) break;
ll dx2 = dx1, dy2 = dy1;
while (!sbt.empty()) {
tie(dx1, dy1) = sbt.top();
if (inside(x + dx1, y - dy1)) break;
sbt.pop();
dx2 = dx1, dy2 = dy1;
}
if (sbt.empty()) break;
for (;;) {
ll mx = dx1 + dx2, my = dy1 + dy2;
if (inside(x + mx, y - my)) {
sbt.push({dx1 = mx, dy1 = my});
} else {
if (cut(x + mx, P{dx1, dy1})) break;
dx2 = mx, dy2 = my;
}
}
}
rep(i, 1, y) ret += n / i;
ret = ret * 2 - SQ * SQ;
return ret;
}
int main() {
int t;
cin >> t;
while (t--) {
long n;
cin >> n;
n = 2 * n + 1;
mint ans = solve(n) - 2 * solve(n / 2) + solve(n / 4) - n;
cout << ans.val() << endl;
}
}
遭難者