結果
| 問題 | No.1918 Simple Math ? |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-02 06:26:39 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,386 bytes |
| コンパイル時間 | 1,706 ms |
| コンパイル使用メモリ | 199,124 KB |
| 実行使用メモリ | 274,692 KB |
| 最終ジャッジ日時 | 2025-10-02 06:26:46 |
| 合計ジャッジ時間 | 5,871 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 5 TLE * 1 -- * 27 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(a) begin(a), end(a)
#define rall(a) rbegin(a), rend(a)
#define len(a) (int)((a).size())
const ll INF = 1'000'000'000'000'000'000, MOD = 1'000'000'007;
ll root(ll a) {
ll v = sqrt(a);
while (v * v > a) --v;
while ((v + 1) * (v + 1) <= a) ++v;
return v;
}
ll sq_sum(ll n, ll add, ll dv) {
if (n == 1) {
return (1 + add) / dv;
}
vector<ll> pts = {1, 2};
ll i = 2;
auto get_val = [&](ll i) {
return (i * i + add) / dv;
};
auto get_val2 = [&](ll i) {
return i * i;
};
while (i < n) {
auto check = [&](ll x) {
ll pt1 = pts[len(pts) - 2], pt2 = pts[len(pts) - 1], pt3 = x;
ll val1 = get_val2(pt1), val2 = get_val2(pt2), val3 = get_val2(pt3);
return (val2 - val1) * (pt3 - pt2) != (val3 - val2) * (pt2 - pt1);
};
ll l = i, r = n;
while (r - l > 1) {
ll mid = (l + r) / 2;
if (check(mid)) {
r = mid;
} else {
l = mid;
}
}
if (l != pts.back()) pts.push_back(l);
pts.push_back(r);
i = r;
}
for (int i = 1; i < len(pts); ++i) {
for (int j = pts[i - 1] + 1; j < pts[i]; ++j) {
ll a = get_val2(j) - get_val2(j - 1), b = get_val2(j + 1) - get_val2(j);
assert(a == b);
}
}
ll ans = get_val(pts[0]);
auto progr = [&](ll l, ll r, ll add) {
ll q = (2 * get_val(l) + add * (r - l)) * (r - l + 1);
assert(q % 2 == 0);
return q / 2;
};
for (int i = 1; i < len(pts); ++i) {
ll st = pts[i - 1] + 1, nd = pts[i];
ll add = get_val(nd) - get_val(nd - 1);
ans += progr(st, nd, add);
ans %= MOD;
}
return ans;
}
// ll sq_sum(ll n, ll add, ll dv) {
// ll calc = 0;
// for (ll v = 1; v <= n; ++v) {
// calc += (v * v + add) / dv;
// calc %= MOD;
// }
// return calc;
// }
ll solve(ll a, ll n) {
return ((n + 1) % MOD * (root(a * n)) % MOD - sq_sum(root(a * n), a - 1, a) + MOD) % MOD;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
ll a, n;
cin >> a >> n;
cout << solve(a, n) << endl;
}
return 0;
}