結果

問題 No.752 mod数列
ユーザー gazellegazelle
提出日時 2018-11-09 22:12:30
言語 C++17
(gcc 12.2.0 + boost 1.81.0)
結果
AC  
実行時間 174 ms / 2,000 ms
コード長 2,684 bytes
コンパイル時間 1,043 ms
実行使用メモリ 6,088 KB
最終ジャッジ日時 2022-12-26 20:09:30
合計ジャッジ時間 6,200 ms
ジャッジサーバーID
(参考情報)
judge11 / judge13
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
3,592 KB
testcase_01 AC 1 ms
3,540 KB
testcase_02 AC 1 ms
3,484 KB
testcase_03 AC 1 ms
3,516 KB
testcase_04 AC 1 ms
3,552 KB
testcase_05 AC 1 ms
3,528 KB
testcase_06 AC 2 ms
3,424 KB
testcase_07 AC 2 ms
3,588 KB
testcase_08 AC 2 ms
3,532 KB
testcase_09 AC 1 ms
3,492 KB
testcase_10 AC 5 ms
4,120 KB
testcase_11 AC 4 ms
3,836 KB
testcase_12 AC 5 ms
3,924 KB
testcase_13 AC 5 ms
3,708 KB
testcase_14 AC 5 ms
4,072 KB
testcase_15 AC 144 ms
4,688 KB
testcase_16 AC 150 ms
6,056 KB
testcase_17 AC 174 ms
6,088 KB
testcase_18 AC 155 ms
4,624 KB
testcase_19 AC 163 ms
4,760 KB
testcase_20 AC 165 ms
4,564 KB
testcase_21 AC 165 ms
4,712 KB
testcase_22 AC 163 ms
4,568 KB
testcase_23 AC 166 ms
5,024 KB
testcase_24 AC 164 ms
4,564 KB
testcase_25 AC 52 ms
4,692 KB
testcase_26 AC 139 ms
5,336 KB
testcase_27 AC 100 ms
5,068 KB
testcase_28 AC 127 ms
5,376 KB
testcase_29 AC 169 ms
5,292 KB
testcase_30 AC 170 ms
5,600 KB
testcase_31 AC 1 ms
3,492 KB
testcase_32 AC 2 ms
3,540 KB
testcase_33 AC 3 ms
3,956 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#include<iomanip>
#include<math.h>
#include<bitset>
#include<cassert>
using namespace std;
using ll=long long;
using ld=long double;
using P=pair<ll,ll>;
#define MOD 1000000007LL
#define INF 1000000000LL
#define EPS 1e-10
#define FOR(i,n,m) for(ll i=n;i<(ll)m;i++)
#define REP(i,n) FOR(i,0,n)
#define DUMP(a) REP(d,a.size()){cout<<a[d];if(d!=a.size()-1)cout<<" ";else cout<<endl;}
#define ALL(v) v.begin(),v.end()
#define UNIQUE(v)  sort(ALL(v));v.erase(unique(ALL(v)),v.end());
#define pb push_back

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	ll p, q;
	cin >> p >> q;
	ll n = round(sqrt(p));
	vector<P> area(n + 1);
	REP(i,n + 1) {
		if(i == 0) {
			area[i].first = p + 1;
			area[i].second = INF + 10;
		} else {
			if(p % (i + 1) == 0) area[i].first = p / (i + 1) + 1;
			else area[i].first = p / (i + 1) + 1;
			area[i].second = area[i - 1].first - 1;
		}
	}
	vector<ll> area_sum(n + 1);
	REP(i,n + 1) {
		if(i == 0) {
			area_sum[i] = 0;
			continue;
		}
		ll fir = p % area[i].second;
		ll sec = p % area[i].first;
		area_sum[i] = (fir + sec) * (area[i].second - area[i].first + 1) / 2;
		if(i > 0) area_sum[i] += area_sum[i - 1];
	}
	vector<ll> els;
	for(ll i = 1; i < area[n].first; i++) {
		els.pb(p % i);
	}
	vector<ll> els_sum(els.size());
	els_sum[0] = els[0];
	FOR(i,1,els.size()) {
		els_sum[i] = els[i] + els_sum[i - 1];
	}
	vector<ll> l(q);
	vector<ll> r(q);
	REP(i,q) cin >> l[i] >> r[i];
	REP(i,q) {
		if(r[i] <= (ll)els.size()) {
			ll ans = els_sum[r[i] - 1];
			if(l[i] > 1) ans -= els_sum[l[i] - 2];
			cout << ans << endl;
			continue;
		}
		ll ans = 0;
		if(l[i] <= (ll)els.size()) {
			ans += els_sum[(ll)els.size() - 1];
			if(l[i] > 1) ans -= els_sum[l[i] - 2];
			l[i] = area[n].first;
		}
		ll l_mod = -1, r_mod = -1;
		ll lb = n, ub = -1;
		while(lb - ub > 1) {
			ll m = (lb + ub) / 2;
			if(area[m].first <= l[i]) lb = m;
			else ub = m;
		}
		l_mod = lb;
		lb = n; ub = -1;
		while(lb - ub > 1) {
			ll m = (lb + ub) / 2;
			if(area[m].first <= r[i]) lb = m;
			else ub = m;
		}
		r_mod = lb;
		if(l_mod == r_mod) {
			ll fir = p % r[i];
			ll sec = p % l[i];
			ans += (r[i] - l[i] + 1) * (fir + sec) / 2;
			cout << ans << endl;
			continue;
		}
		ll fir = p % r[i];
		ll sec = p % area[r_mod].first;
		ans += (r[i] - area[r_mod].first + 1) * (fir + sec) / 2;
		fir = p % area[l_mod].second;
		sec = p % l[i];
		ans += (area[l_mod].second - l[i] + 1) * (fir + sec) / 2;
		l_mod--;
		r_mod++;
		if(l_mod < r_mod) {
			cout << ans << endl;
		} else {
			ans += area_sum[l_mod];
			ans -= area_sum[r_mod - 1];
			cout << ans << endl;
		}
	}
	return 0;
}
0