結果
| 問題 |
No.752 mod数列
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-11-09 22:25:05 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 242 ms / 2,000 ms |
| コード長 | 1,286 bytes |
| コンパイル時間 | 2,223 ms |
| コンパイル使用メモリ | 193,112 KB |
| 最終ジャッジ日時 | 2025-01-06 16:07:34 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int64_t r[100001], s[100001], mn[100001];
int main(){
int64_t P;
int Q;
cin >> P >> Q;
int64_t bound = 1;
while(bound*bound <= P) bound++;
r[0] = 0;
for(int i=1; i<bound; i++){
r[i] = r[i-1] + P%i;
}
s[0] = 0;
for(int i=0; i<=P/bound; i++){
mn[i] = P/(i+1) + 1;
if(i>0){
int64_t num = mn[i-1] - mn[i];
s[i] = s[i-1] + P*num - (mn[i-1]-1 + mn[i]) * num / 2 * i;
}
}
while(Q--){
int64_t Lo, Ro;
cin >> Lo >> Ro;
int64_t ans = 0;
if(Lo <= bound-1){
int L = Lo, R = min(bound-1, Ro);
ans += r[R] - r[L-1];
}
if(bound <= Ro){
int L = max(Lo, bound), R = Ro;
int lq = P/L, rq = P/R;
if(lq == rq){
int64_t num = R - L + 1;
ans += P*num - (R+L) * num / 2 * lq;
}else{
ans += s[lq-1] - s[rq];
int64_t num = R - mn[rq] + 1;
ans += P*num - (R+mn[rq]) * num / 2 * rq;
num = mn[lq-1] - L;
ans += P*num - (mn[lq-1]-1+L) * num / 2 * lq;
}
}
cout << ans << endl;
}
return 0;
}