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  

 

posted @ 2020-07-10 17:26  ltin  阅读(71)  评论(0)    收藏  举报