D与C(牛客)


分析一下就是一个简单的数论组合数
唯一注意的就是要用逆元,否则要写挂
容斥:ans=总方案数-两个图毫不相干的方案数
总方案数=C((n(n-1)/2),a)×C((n(n-1)/2,b);
毫不相干=C((n(n-1)/2),a)×C((n(n-1)/2-a,b);

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7; 
ll fastmi(ll a,ll b){
	ll sum=1;
	while(b){
		if(b&1)sum=sum*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return sum;
}
ll inv(ll a){
	return fastmi(a,mod-2)%mod;
}
int main(){
	int n,a,b;
	cin>>n>>a>>b;
	int m=(n-1)*n/2,cc=m-a;
	ll fz1=1,fm1=1,fz2=1,fm2=1,fz3=1,fm3=1;
	for(int i=m;i>=(m-a+1);i--)fz1=(fz1*i)%mod;
	for(int i=1;i<=a;i++)fm1=(fm1*i)%mod;
	for(int i=m;i>=(m-b+1);i--)fz2=(fz2*i)%mod;
	for(int i=1;i<=b;i++)fm2=(fm2*i)%mod;
	for(int i=cc;i>=(cc-b+1);i--)fz3=(fz3*i)%mod;
	for(int i=1;i<=b;i++)fm3=(fm3*i)%mod;
	ll t1=(fz1*inv(fm1))%mod;
	ll t2=(fz2*inv(fm2))%mod;
	ll t3=(fz3*inv(fm3))%mod;
	cout<<t1*(t2-t3+mod)%mod; 
     return 0;
}
原文地址:https://www.cnblogs.com/wzxbeliever/p/15675064.html