#include <bits/stdc++.h>
using namespace std;
struct SparseSegmentTree {
struct Node {
int sum = 0;
int lazy = 0;
Node *left = nullptr;
Node *right = nullptr;
};
int n;
Node *root;
SparseSegmentTree(int _n) {
n = _n;
root = new Node();
}
void apply(Node *cur, int len, int val) {
cur -> lazy = val;
cur -> sum = len * val;
}
void push(Node *cur, int l, int r) {
if (cur -> left == nullptr) cur -> left = new Node;
if (cur -> right == nullptr) cur -> right = new Node;
if (cur -> lazy == 0) return;
int m = (l + r) / 2;
apply(cur -> left, m - l + 1, cur -> lazy);
apply(cur -> right, r - m, cur -> lazy);
cur -> lazy = 0;
}
void update(Node *cur, int tl, int tr, int l, int r, int v) {
if (r < tl || tr < l) return;
if (l <= tl && tr <= r) {
apply(cur, tr - tl + 1, v);
return;
}
push(cur, tl, tr);
int tm = (tl + tr) / 2;
update(cur -> left, tl, tm, l, r, v);
update(cur -> right, tm + 1, tr, l, r, v);
cur -> sum = cur -> left -> sum + cur -> right -> sum;
}
int get(Node *cur, int tl, int tr, int l, int r) {
if (cur == nullptr) return 0;
if (r < tl || tr < l) return 0;
if (l <= tl && tr <= r) return cur -> sum;
push(cur, tl, tr);
int tm = (tl + tr) / 2;
return get(cur -> left, tl, tm, l, r) + get(cur -> right, tm + 1, tr, l, r);
}
void update(int l, int r, int v) { update(root, 0, n - 1, l, r, v); }
int get(int l, int r) { return get(root, 0, n - 1, l, r); }
};
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, a, b;
cin >> n >> a >> b;
int sum = 0;
vector<int> l(n), r(n);
for (int i = 0; i < n; i++) {
cin >> l[i] >> r[i];
sum += r[i] - l[i] + 1;
}
int g = gcd(a, b + 1);
if (__int128(a) * b / g >= 1e18) {
cout << sum << '\n';
return 0;
}
int x = a / g * b;
for (int i = 0; i < n; i++) {
l[i] %= x;
r[i] %= x;
}
SparseSegmentTree t(x + 10);
for (int i = 0; i < n; i++) {
if (l[i] <= r[i]) {
t.update(l[i], r[i], 1);
} else {
t.update(l[i], x - 1, 1);
t.update(0, r[i], 1);
}
}
cout << t.get(0, x - 1) << '\n';
return 0;
}