組合數學

題目:ios

很好的組合數學。數組

代碼:ide

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int max_=2e5+2;
ll F[max_],Finv[max_];
int a;
bool check(int s)
{
    while(s)
    {
        if(s%10!=4&&s%10!=7)
            return 0;
        s/=10;
    }
    return 1;
}
ll pow_mod(ll x,ll n)
{
    x%=mod;
    ll res=1;
    while(n)
    {
        if(n&1)
            res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}
ll inv(ll x)//逆元
{
    return pow_mod(x,mod-2);
}
void factrial()//階乘
{
    F[0]=1,Finv[0]=1;
    for(ll i=1;i<max_;i++)
    {
        F[i]=F[i-1]* 1ll *i%mod;//n數組的階乘
        Finv[i]=Finv[i-1]*inv(i)%mod;//n數組逆元的階乘
    }
}
ll C(ll n,ll m)//組合數,從n個選出m個,combination
{
    if(m<0||m>n)
        return 0;
    else
       return F[n]*Finv[n-m]%mod*Finv[m]%mod;
}
map<ll,ll>mp;
int main()
{
    ll n,m;
    factrial();//求出數組
    cin>>n>>m;
    ll coun=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a);
        if(mp[a]&&check(a))
            coun++;//記錄重複不吉利的個數
        else
            mp[a]=1;
    }
    ll x=n-coun;
    //cout<<C(4,2)<<endl;
    //cout<<x<<d<<endl;
    cout<<(C(x,m)+C(x-1,m-1)*coun%mod)%mod<<endl;//從沒重複的中選出C(x,m),而後加上去掉一個重複不吉利的數後從重複的集合選
}
View Code
相關文章
相關標籤/搜索