purfer sequence的应用
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
const int MAXN=1000100;
long long fac[MAXN],inv[MAXN];
long long powmod(long long x,long long p)
{
long long ret=1;
while(p)
{
if(p&1)
ret=ret*x%mod;
p>>=1;
x=x*x%mod;
}
return ret;
}
int main()
{
long long n,m,u[20],d[20],vis[20],i,j,cnt,sum,t,tmp,ans,flag;
fac[0]=1;
for(i=1;i<MAXN;i++)
{
fac[i]=fac[i-1]*i%mod;
}
inv[MAXN-1]=powmod(fac[i-1],mod-2);
for(i=MAXN-2;i>=0;i--)
inv[i]=inv[i+1]*(i+1)%mod;
while(~scanf("%lld%lld",&n,&m))
{
for(i=0;i<m;i++)
scanf("%lld%lld",&u[i],&d[i]);
if(n==1)
{
if(m)
printf("0\n");
else
printf("1\n");
continue;
}
ans=powmod(n,n-2);
for(i=1;i<(1<<m);i++)
{
memset(vis,0,sizeof(vis));
flag=0;
cnt=sum=0;
t=1;
for(j=0;j<m;j++)
{
if(i&(1<<j))
{
if(vis[u[j]])
flag=1;
cnt++;
sum+=d[j]-1;
vis[u[j]]=1;
t=t*inv[d[j]-1]%mod;
}
}
if(flag||sum>n-2)
continue;
tmp=fac[n-2]*inv[n-2-sum]%mod*powmod(n-cnt,n-2-sum)%mod*t%mod;
if(cnt&1)
ans=(ans-tmp+mod)%mod;
else
ans=(ans+tmp)%mod;
}
printf("%lld\n",ans);
}
}