传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2751
水……
Code:
#include<cstdio>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
int n,m,k;
pair<int,int> a[maxn];
LL ans=1;
LL p=1000000007;
LL mul(LL x,LL k,LL p){
LL ans=0;
for(;k;k>>=1){
if(k&1)ans=(ans+x)%p;
x=(x+x)%p;
}return ans;
}
LL power(LL x,LL k,LL p){
LL ans=1;x%=p;
for(;k;k>>=1){
if(k&1)ans=mul(ans,x,p);
x=mul(x,x,p);
}return ans;
}
LL getint(){
LL res=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))res=res*10+c-'0',c=getchar();
return res;
}
set<int>S;
map<LL,LL>M;
int main(){
n=getint();m=getint();k=getint();
for(int i=1;i<=k;i++){
int x=getint(),y=getint();
a[i].first=x;
a[i].second=y;
S.insert(x);
}LL Sum=(LL)n*(n+1)/2;Sum%=p;
ans=power(Sum,m-S.size(),p);
sort(a+1,a+1+k);
int size=unique(a+1,a+1+k)-a-1;
for(int i=1;i<=size;i++)
M[a[i].first]-=a[i].second;
for(map<LL,LL>::iterator it=M.begin();it!=M.end();it++){
LL res=it->second+Sum;
while(res<0)res+=p;
ans=(ans*res)%p;
}
cout<<ans<<endl;
return 0;
}