谢谢laoda(不是dalao)帮看一下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Mod=1000000007;
ll n,m,k;
struct Limit{
ll x,y;
}lim[100005],removal[100005];
int len=0;
bool cmp(Limit a,Limit b){
if(a.x==b.x)return a.y<b.y;
else return a.x<b.x;
}
ll quick_row(ll a,ll b){
ll ans=1,base=a%Mod;
while(b){
if(b&1!=0){
ans*=base;
ans%=Mod;
}
base*=base;
base%=Mod;
b>>=1;
}
return ans;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=k;i++){
scanf("%lld%lld",&lim[i].x,&lim[i].y);
}
sort(lim+1,lim+k+1,cmp);
int num=1;
while(num<=k){
ll tmpx=lim[num].x,tmpy=lim[num].y;
removal[++len].x=tmpx,removal[len].y=tmpy;
num++;
while(tmpx==lim[num].x&&tmpy==lim[num].y){
num++;
}
}
int cd=removal[1].x,cnt=1;
for(int i=2;i<=len;i++){
if(removal[i].x==cd){
continue;
}else{
cd=removal[i].x;
cnt++;
}
}
ll sum=quick_row(n*(n+1)/2,m-cnt);
ll tmp=n*(n+1)/2%Mod;
tmp-=removal[1].y;
for(int i=2;i<=len;i++){
if(removal[i].x==removal[i-1].x){
tmp-=removal[i].y%Mod;
}else{
sum*=tmp;sum%=Mod;
tmp=n*(n+1)/2-removal[i].y;
tmp%=Mod;
}
}
sum*=tmp;sum%=Mod;
printf("%lld",sum);
return 0;
}