题目描述
题解
随便化化式子就知道答案应该是每一位能选的数的和的积
去重之后用map啥的记录一下就行了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
#define Mod 1000000007
#define LL long long
#define N 100005
int n,m,k,cnt;
struct data
{
int x,y;
bool operator < (const data &a) const
{
return x<a.x||(x==a.x&&y<a.y);
}
bool operator == (const data &a) const
{
return x==a.x&&y==a.y;
}
}limit[N];
LL sum[N],ans;
map <int,int> have_limit;
LL fast_pow(LL a,int p)
{
LL ans=1LL;
for (;p;p>>=1,a=a*a%Mod)
if (p&1)
ans=ans*a%Mod;
return ans;
}
LL inv(LL a)
{
return fast_pow(a,Mod-2);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=k;++i) scanf("%d%d",&limit[i].x,&limit[i].y);
sort(limit+1,limit+k+1);k=unique(limit+1,limit+k+1)-limit-1;
for (int i=1;i<=k;++i)
{
int x=limit[i].x,y=limit[i].y;
if (!have_limit[x])
{
have_limit[x]=++cnt;
sum[cnt]=(((LL)n*(n+1)%Mod*inv(2))%Mod-y+Mod)%Mod;
}
else
{
x=have_limit[x];
sum[x]=(sum[x]-y+Mod)%Mod;
}
}
ans=fast_pow((LL)n*(n+1)%Mod*inv(2)%Mod,m-cnt);
for (int i=1;i<=cnt;++i) ans=ans*sum[i]%Mod;
printf("%lld\n",ans);
}