// これTLEじゃん() #include using namespace std; #define all(x) (x).begin(),(x).end() #define rep(i, n) for (int i = 0; i < (n); i++) #define chmin(x, y) (x) = min((x), (y)) #define chmax(x, y) (x) = max((x), (y)) #define endl "\n" typedef long long ll; typedef pair pii; typedef pair pll; template ostream &operator<<(ostream &os, const vector &vec) {os << "["; for (const auto &v : vec) {os << v << ","; } os << "]"; return os;} template ostream &operator<<(ostream &os, const pair &p) {os << "(" << p.first << ", " << p.second << ")"; return os;} const int mod = 1e9 + 7; vector> mul(vector> &A, vector> &B, int mod) { int N = A.size(), M = B[0].size(), K = A[0].size(); vector> ret(N, vector(M)); for(int i = 0; i < N; i++) { for(int j = 0; j < M; j++) { for(int k = 0; k < K; k++) { ret[i][j] += A[i][k] * B[k][j]; ret[i][j] %= mod; } } } return ret; } vector> pow(vector> &A, int n, int mod) { if (n == 0) { int N = A.size(); vector> E(N, vector(N)); for(int i = 0; i < N; i++) { E[i][i] = 1; } return E; } vector> m = pow(A, n / 2, mod); if (n % 2 == 1) { vector> temp = mul(m, m, mod); return mul(A, temp, mod); } else { return mul(m, m, mod); } } void solve() { int N, M, K; cin >> N >> M >> K; vector L(M), R(M); for(int i = 0; i < M; i++) { cin >> L[i] >> R[i]; } vector> C; for(int p = 0; p <= N; p++) { vector c(N + 1); vector imos(N + 2); for(int i = 0; i < M; i++) { int l = L[i], r = R[i]; if (l <= p && p <= r) { imos[l]++; imos[r + 1]--; } } int now = 0; for(int j = 0; j <= N; j++) { now += imos[j]; c[j] = now; } C.push_back(c); } vector> C_ = pow(C, K, mod); vector> v(N + 1, vector(1, 0)); v[1][0] = 1; vector> ret = mul(C_, v, mod); cout << ret[N][0] << endl; } int main() { #ifdef LOCAL_ENV cin.exceptions(ios::failbit); #endif cin.tie(0); ios::sync_with_stdio(false); cout.setf(ios::fixed); cout.precision(16); solve(); }