传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2751

稍微推一下就知道是每一位置可取的值的和乘起来

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

typedef long long qword;
const qword maxn = 100010;
const qword mod = 1000000007;
const qword Mx = 500000004;
qword M, m, n;

struct node {
    qword pos, v;
}e[maxn];

bool cmp(node a, node b) {
    if(a.pos == b.pos) return a.v < b.v;
    else return a.pos < b.pos;
}

void read() {
    scanf("%lld%lld%lld", &M,  &m, &n);
    for(qword i = 1; i <= n; ++ i) scanf("%lld%lld", &e[i].pos, &e[i].v);
}

qword Pow(qword a, qword b) {
    qword ret = 1; qword now = a % mod;
    while(b) {
        if(b & 1) ret = ret * now % mod;
        b >>= 1, now = now * now % mod;
    }
    return ret;
}

qword ans = 1;

void sov() {
    sort(e + 1, e + 1 + n, cmp);
    qword pre = 0;
    qword S = M * (M + 1) % mod * Mx % mod;
    for(qword i = 1; i <= n; ++ i) {
        qword ls, rs; ls = i, rs = i;
        while(e[rs + 1].pos == e[ls].pos) rs ++;
        ans = ans * Pow(S, e[ls].pos - pre - 1) % mod; pre = e[ls].pos; 
        qword Tmp = S;
        for(qword j = ls; j <= rs; ++ j) {
            if(e[j].pos == e[j - 1].pos && e[j].v == e[j - 1].v) continue;
            Tmp = (Tmp - e[j].v) % mod;
        }
        Tmp = (Tmp % mod + mod) % mod;
        ans = ans * Tmp % mod;
        i = rs;
    }
    if(pre != m) ans = ans * Pow(S, m - pre) % mod;
    printf("%lld\n", ans);
}

int main() {
    //freopen("test.in", "r", stdin);
    read(), sov();
    return 0;
}