#include using namespace std; typedef long long ll; template class Modulo { int n; static typename std::enable_if::type inv(ll a, ll p) { return (a == 1 ? 1 : (1 - p * inv(p % a, a)) / a + p); } public: Modulo() : n(0) { ; } Modulo(int m) : n(m) { if (n >= M) n %= M; else if (n < 0) n = (n % M + M) % M; } Modulo(ll m) { if (m >= M) m %= M; else if (m < 0) m = (m % M + M) % M; n = m; } explicit operator int() const { return n; } explicit operator ll() const { return n; } bool operator==(const Modulo &a) const { return n == a.n; } Modulo &operator+=(const Modulo &a) { n += a.n; if (n >= M) n -= M; return *this; } Modulo &operator-=(const Modulo &a) { n -= a.n; if (n < 0) n += M; return *this; } Modulo &operator*=(const Modulo &a) { n = (ll(n) * a.n) % M; return *this; } Modulo operator+(const Modulo &a) const { Modulo res = *this; return res += a; } Modulo operator-(const Modulo &a) const { Modulo res = *this; return res -= a; } Modulo operator-() const { return Modulo(0) - *this; } Modulo operator*(const Modulo &a) const { Modulo res = *this; return res *= a; } Modulo operator^(ll m) const { if (m == 0) return Modulo(1); const Modulo a = *this; Modulo res = (a * a) ^(m / 2); return m % 2 ? res * a : res; } typename std::enable_if::type operator/(const Modulo &a) const { return *this * inv(ll(a), M); } typename std::enable_if::type operator/=(const Modulo &a) { return *this *= inv(ll(a), M); } friend bool is_zero(const Modulo &x) { return int(x) == 0; } friend int abs(const Modulo &x) { return int(x); } static Modulo fact(int n, bool sw = true) { static std::vector v1 = {1}, v2 = {1}; if (n >= (int) v1.size()) { const int from = v1.size(), to = n + 1024; v1.reserve(to); v2.reserve(to); for (int i = from; i < to; ++i) { v1.push_back(v1.back() * Modulo(i)); v2.push_back(v2.back() / Modulo(i)); } } return sw ? v1[n] : v2[n]; } static Modulo comb(int a, int b) { if (b < 0 || b > a) return 0; return Modulo::fact(a, true) * Modulo::fact(b, false) * Modulo::fact(a - b, false); } }; typedef Modulo<1000000007, true> mInt; template class FenwickTree { int n; std::vector data; public: FenwickTree(int count) : n(count), data(count, 0) { ; } void add(int pos, const T &value) { assert(0 <= pos && pos < n); for (int i = pos; i < n; i |= i + 1) data[i] += value; } // 区間 [0, pos) 番目の範囲の和を求める.(pos = 0 のときは 0 を返す.) T sum(int pos) const { assert(0 <= pos && pos <= n); T res = 0; for (int i = pos - 1; i >= 0; i = (i & (i + 1)) - 1) { res += data[i]; } return res; } // 区間 [l, r) 番目の範囲の和を求める.(l = r のときは 0 を返す.) T sum(int l, int r) const { assert(0 <= l && l <= r && r <= n); return sum(r) + (-sum(l)); } using value_type = T; using update_type = T; }; pair seg[3010]; int main() { int N, M, K; cin >> N >> M >> K; for (int i = 0; i < M; i++) { int a, b; cin >> a >> b; --a; seg[i] = {a, b}; } FenwickTree dp(N); dp.add(0, 1); for (int k = 0; k < K; k++) { FenwickTree dp2(N); for (int j = 0; j < M; j++) { mInt tot = dp.sum(seg[j].first, seg[j].second); dp2.add(seg[j].first, tot); if( seg[j].second < N ) dp2.add(seg[j].second, -tot); } FenwickTree dp3(N); for (int j = 0; j < N; j++) { dp3.add(j, dp2.sum(0, j + 1)); } swap(dp, dp3); } cout << (ll) dp.sum(N - 1, N) << endl; return 0; }