結果
| 問題 |
No.752 mod数列
|
| コンテスト | |
| ユーザー |
ei1333333
|
| 提出日時 | 2018-11-09 22:40:25 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 945 bytes |
| コンパイル時間 | 2,304 ms |
| コンパイル使用メモリ | 198,388 KB |
| 最終ジャッジ日時 | 2025-01-06 16:11:52 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 TLE * 7 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
int main() {
int P, Q;
cin >> P >> Q;
vector< pair< pair< int, int >, int > > rad;
int ptr = 1;
while(ptr <= P) {
int ok = ptr, ng = P + 1;
int real = P / ptr;
while(ng - ok > 1) {
int mid = (ok + ng) / 2;
if(P / mid == real) ok = mid;
else ng = mid;
}
rad.emplace_back(make_pair(ptr, ok), P / ptr);
ptr = ok + 1;
}
auto get = [&](int L, int R) {
__int128_t add = 1LL * P * (R - L + 1);
for(auto &p : rad) {
auto range = p.first;
auto val = p.second;
int latte = max(range.first, L);
int malta = min(range.second, R);
if(latte > malta) continue;
add += val * (1LL * latte * (latte - 1) / 2);
add -= val * (1LL * malta * (malta + 1) / 2);
}
return (int64) add;
};
while(Q--) {
int L, R;
cin >> L >> R;
cout << get(L, R) << endl;
}
}
ei1333333