001-AtCoder Beginner Contest 172-NEQ
原题链接:https://atcoder.jp/contests/abc172/tasks/abc172_e
题意: 用1~M内数字组成长度为N的数组A,B满足下列条件:
① Ai≠Bi
② Ai≠Aj and Bi≠Bj (就是不能选重复的)
求可能的情况数,对1e9+7取模
思路:容斥原理,A的取法有A(m,n)种,n个位置里选k个重复,B的选法有C(n,i)*A(m-i,n-i)
对某一种A的可能性数:Σ(0~n)(-1)^k*C(n,k)*A(m-k,n-k)
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned ll 4 #define db double 5 #define inf 0x3f3f3f3f 6 using namespace std; 7 8 const int N=5e5+10,mod=1e9+7; 9 10 11 ll fac[N],inv[N]; 12 ll ksm(ll a,ll n){ 13 ll ans=1; 14 while(n){ 15 if(n&1) ans=ans*a%mod; 16 a=a*a%mod; 17 n>>=1; 18 } 19 return ans; 20 } 21 ll C(int m,int n){ 22 return fac[m]*inv[m-n]%mod*inv[n]%mod; 23 } 24 ll A(int m,int n){ 25 return fac[m]*inv[m-n]%mod; 26 } 27 28 29 int main(){ 30 int n,m; 31 cin>>n>>m; 32 fac[0]=1; 33 for(int i=1;i<=m;i++) fac[i]=fac[i-1]*i%mod; 34 inv[m]=ksm(fac[m],mod-2); 35 for(int i=m-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod; 36 ll ans=0; 37 for(int i=0;i<=n;i++) ans+=C(n,i)*((i&1)?-1:1)*A(m-i,n-i)%mod; 38 ans=(ans%mod+mod)%mod; 39 ans=(ans*A(m,n)%mod); 40 cout<<ans<<endl; 41 } 42
浙公网安备 33010602011771号