题意

有一个数列其中的数都是由中的数字组成的 并且知道对于数列中的中有哪些值不能取 现在讲数列中所有的数累乘起来 然后将每一种情况的情况累加起来

首先我们来看如果不去掉一些值怎么算

就是 这个对吧 其实这就是一个乘法分配律了,可以化成 然后我们就会发现 如果 第一个数字不能取1 就相当于少了 这一段 那么化出来来就是

好了 到现在就很明显了 首先将 算出来 然后如果有全部都能取的就都是如果有不能取的 就用减掉那个 然后再累成上去

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef long double ld;
const ll MOD = 1e9 + 7;
inline ll read() { ll s = 0, w = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') w = -1; for (; isdigit(ch); ch = getchar())    s = (s << 1) + (s << 3) + (ch ^ 48); return s * w; }
const int N = 1e5 + 7;
const int INF = 0x3f3f3f3f;
ll qpow(ll a, ll b) { ll ans = 1;   while (b) { if (b & 1)  ans *= a;       b >>= 1;      a *= a; }   return ans; }   ll qpow(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; }

struct node{
    ll id , val;
}a[N];
ll c[N];

bool cmp(node a , node b){
    if(a.id == b.id)    return a.val < b.val;
    return a.id < b.id;
}

void solve(){
    ll n = read() , m = read() , k = read();
    for(ll i = 1 ; i <= k ; ++i){
        a[i].id = read();
        a[i].val = read();
    }
    sort(a + 1 , a + k + 1 , cmp);
    ll sum = (n * (n + 1)) % MOD / 2 % MOD;
    ll ans = 1;
    ll tot = 0;
    for(ll i = 1 ; i <= k ; ++i){
        if(a[i - 1].id != a[i].id){
            c[++tot] = sum;
        }
        else{
            if(a[i - 1].val == a[i].val)    continue;
        }
        c[tot] = ((c[tot] - a[i].val) % MOD + MOD) % MOD; 
    }
    ans = qpow(sum , m - tot , MOD);
    for(ll i = 1 ; i <= tot ; ++i){
        ans = (ans * c[i] % MOD + MOD) % MOD;
    }
    cout<<ans<<endl;
}

int main(void){
    solve();

    return 0;
}