Submission #1367095

#TimeUsernameProblemLanguageResultExecution timeMemory
1367095vjudge1Strange Device (APIO19_strange_device)C++20
35 / 100
243 ms16096 KiB
#include <bits/stdc++.h>
using namespace std;
#define lazy cin.tie(0)->sync_with_stdio(0), cout.tie(0)
#define int long long
#define i128 __int128
int LIMIT = 1000000000000000000LL;

/*

x = ((t +  t/B) % A)

t/B -> t = (t/B) * B + t%B
t = (t/B) * B + y

x=((t/B) * B + y + (t/B))%A
x =((t/B)*(B+1)+y)modA

y = t % B


when B = 3

for entire t:
120120120...

(l to r)
t2 - t1 = k * B ?

use gcd

k ->>  A/ (A,B+1) - > P = B *  gcd(A,B+1) A????

*/
signed main() {
    lazy;


    int n;
    int A, B;
    cin >> n >> A >> B;

    int g = gcd(A, B + 1);

    i128 P = (A / g) * B;


    vector<pair<int, int>> segs;
    segs.reserve(2LL * n);

    int total_len = 0;

    if (P > LIMIT) {
        for (int i = 0; i < n; i++) {
            int l, r;
            cin >> l >> r;
            total_len += r - l + 1;
        }

        cout << total_len << '\n';
        return 0;
    }


    for (int i = 0; i < n; i++) {
        int l, r;
        cin >> l >> r;

        int len = r - l + 1;

        if (len >= P) {
            cout <<(int) P << '\n';
            return 0;
        }

        int start = l % P;
        int end = start + len - 1;

        if (end < P) {
            segs.push_back({start, end});
        } else {
            segs.push_back({start, P - 1});
            segs.push_back({0, end % P});
        }
    }

    sort(segs.begin(), segs.end());

    int ans = 0;
    int cur_l = -1;
    int cur_r = -1;

    for (auto [l, r] : segs) {
        if (cur_l == -1) {
            cur_l = l;
            cur_r = r;
        } else if (l <= cur_r + 1) {
            cur_r = max(cur_r, r);
        } else {
            ans += cur_r - cur_l + 1;
            cur_l = l;
            cur_r = r;
        }
    }

    if (cur_l != -1) {
        ans += cur_r - cur_l + 1;
    }

    cout << ans << '\n';
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...