图的计数

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;
}
posted @ 2019-01-23 20:52  银叶草  阅读(127)  评论(0编辑  收藏  举报
Live2D