Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- #include <utility>
- #include <cassert>
- #include <vector>
- using namespace std;
- const int MOD = 1000000007, N = 1000005;
- int n, m, k, ans, degs[N];
- #define forn(i,n) for(int i = 0; i < (int) n; i++)
- inline int add(int a, int b) { a += b; if (a >= MOD) a -= MOD; return a;}
- int main(){
- degs[0] = 1;
- forn(i, N) {
- if (!i) continue;
- degs[i] = add(degs[i-1], degs[i-1]);
- }
- scanf("%d %d %d\n", &n, &m, &k);
- vector < pair<int,int> > edges;
- forn(i, m) {
- int a, b;
- scanf("%d %d", &a, &b);
- if (b - a != 1 && b - a != k + 1) {
- puts("0");
- return 0;
- }
- if (b - a == k + 1) edges.push_back(make_pair(a, b));
- }
- sort(edges.begin(), edges.end()); m = edges.size();
- if (k == 0 || k >= n - 1) {
- puts("1");
- return 0;
- }
- forn(i, m) {
- if (!(edges[i].first >= edges[0].first && edges[i].first < edges[0].second)) {
- puts("0");
- return 0;
- }
- }
- if (edges.size() == 0) ++ans;
- forn(i, n) {
- int f = i + 1, s = i + k + 2, cnt = m;
- if (s > n || (m > 0 && f > edges[0].first)) break;
- if (m > 0 && !(f <= edges[0].first && edges[m-1].first < s)) continue;
- if (m > 0 && f == edges[0].first) cnt--;
- s = min(s, n - k);
- ans = add(ans,degs[s - f - cnt - 1]);
- }
- printf("%d\n", ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment