Description
在观察完第一个作业之后你终于开始观察第二个作业了,第二个作业十分无聊,就只是一道题目。
询问有多少个N个点,M条边的有向图,从1号点到达N号点需要经过至少N-1条边。该有向图中可以包含重边和自环。
Input
第一行两个整数N,M。
Output
仅一个整数表示答案 mod (10^9+7)。
Sample Input
2 2
Sample Output
4
Data Constraint
Hint
对于30%的数据 N<=5,M<=10
对于60%的数据 N<=80,M<=3000
对于100%的数据 1<=N<=10000 1<=M<=100000
.
.
.
.
.
分析
.
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,w,t,mo=1000000007;
long long poww(long long x,long long y)
{
long long r=1;
while (y!=0)
{
if (y&1) r=(long long)r*x%mo;
y>>=1;
x=x*x%mo;
}
return r;
}
int main()
{
scanf("%lld%lld",&n,&m);
long long ans=1;
for (long long i=1;i<=n-2;i++)
ans=(long long)ans*i%mo;
m=m-(n-1);
w=(n+n-1+((n-1)*n)/2%mo)%mo;
t=1;
long long x,y,z;
for (long long i=1;i<=w-1+m;i++)
{
t=(long long)t*i%mo;
if (i==w-1+m) x=t; else
if (i==w-1) y=t; else
if (i==m) z=t;
}
ans=(long long)ans*x%mo*poww(y,mo-2)%mo*poww(z,mo-2)%mo;
printf("%lld",ans);
return 0;
}