题目链接:点击进入
思路
去重,求组合数 c( len , k )(len为去重后的序列长度)
(预处理组合数)
代码
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
//#define int long long
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps=1e-7;
const double pai=acos(-1.0);
const int N=2e4+10;
const int maxn=1e6+10;
const int mod=1e9+7;
ll f[maxn],inv[maxn],p[maxn];
ll qpow(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
void init()
{
f[0]=1;
for(int i=1;i<maxn;i++)
f[i]=f[i-1]*i%mod;
inv[maxn-1]=qpow(f[maxn-1],mod-2);
for(int i=maxn-2;i>=0;i--)
inv[i]=inv[i+1]*(i+1)%mod;
return ;
}
ll c(ll n,ll m)
{
if(n<m) return 0;
else return f[n]*inv[m]%mod*inv[n-m]%mod;
}
int main( )
{
// ios::sync_with_stdio(false);
// cin.tie(0);cout.tie(0);
init();
ll n,m,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>p[i];
sort(p+1,p+n+1);
int len=unique(p+1,p+n+1)-p-1;
cout<<c(len,k)%mod;
return 0;
}