#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif
#define int long long
constexpr int inf = 1e18;
int a, b;
struct Node {
int lazy = 0;
int sum = 0;
Node *left;
Node *right;
Node() {
left = nullptr;
right = nullptr;
}
};
void push(Node *cur, int tl, int tr) {
if (cur -> left == nullptr) cur -> left = new Node();
if (cur -> right == nullptr) cur -> right = new Node();
if (cur -> lazy == 0) return;
int tm = (tl + tr) / 2;
cur -> left -> sum = tm - tl + 1;
cur -> left -> lazy = 1;
cur -> right -> sum = tr - tm;
cur -> right -> lazy = 1;
cur -> lazy = 0;
}
void update(Node *cur, int tl, int tr, int l, int r) {
if (r < tl || tr < l) return;
if (l <= tl && tr <= r) {
cur -> lazy = 1;
cur -> sum = tr - tl + 1;
return;
}
push(cur, tl, tr);
int tm = (tl + tr) / 2;
update(cur -> left, tl, tm, l, r);
update(cur -> right, tm + 1, tr, l, r);
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);
}
Node *root;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
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 >= r[n - 1]) {
cout << sum << '\n';
return 0;
}
int x = a / g * b;
for (int i = 0; i < n; i++) {
l[i] %= x;
r[i] %= x;
}
root = new Node();
for (int i = 0; i < n; i++) {
if (l[i] <= r[i]) {
update(root, 0, x, l[i], r[i]);
} else {
update(root, 0, x, l[i], x - 1);
update(root, 0, x, 0, r[i]);
}
}
cout << get(root, 0, x, 0, x - 1) << '\n';
return 0;
}