[组合数学]JZOJ 3085 图的计数
分析
首先我们确定n-1条边构成的一定是链(废话)
然后我们显然要乘上点的全排列(n-2)!
那么剩下m-n+1条边显然不能成为捷径边(就是使最短路变短的边)
这种捷径边共有(n-1)*(n-2)/2个,之所以要除二是因为反向边不算
然后剩下的就是十分经典的隔板法
答案=C(m-n+1,n*n-(n-1)*(n-2)/2+m-n+1-1)*(n-2)!
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const int N=1e4+10; const int M=1e5+10; const ll P=1e9+7; ll n,m; ll Power(ll a,ll b) {ll ans=1;for (;b;b>>=1,(a*=a)%=P) if (b&1) (ans*=a)%=P;return ans;} ll Fact(ll a,ll from) { ll ans=1ll; for (ll i=from;i<=a;i++) (ans*=i)%=P; return ans; } int main() { scanf("%lld%lld",&n,&m); ll C1=(n-1ll)*(n-2ll)%P*Power(2ll,P-2ll)%P; ll C=Fact(n*n-C1+m-n,n*n-C1)*Power(Fact(m-n+1ll,1),P-2ll)%P; printf("%lld",C*Fact(n-2ll,1)%P); }
在日渐沉没的世界里,我发现了你。