145C - Lucky Subsequence
題意:在一串數中任取K個數,問有幾種情況是不含有兩個相同的luky number
組合數計算模版,這個是超大型的組合數啊
#include<cstdio>#include<iostream>#include<map>#define X 100010#define mod 1000000007using namespace std;typedef long long LL;map<int,int> g;map<int,int>::iterator gi;LL f[X]={1},dp[X]={1};LL mi(LL a,LL b){ LL as=1; while(b){ if(b&1)as=(as*a)%mod; b>>=1;a =(a *a)%mod; } return as;}LL c(LL a,LL b){ if(a<b)return 0; LL as=f[a]; as=(as*mi(f[ b],mod-2))%mod; as=(as*mi(f[a-b],mod-2))%mod; return as;}bool luck(int x){ do if(x%10!=4&&x%10!=7) return 0; while(x/=10); return 1;}int main(void){ for(int i=1;i<X;i++) f[i]=(f[i-1]*i)%mod; int n,k,x; LL cnt=0,ans=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&x); if(luck(x))g[x]++; else cnt++; } int pos=1; for(gi=g.begin();gi!=g.end();gi++) { for(int i=min(pos,k);i>0;i--) { dp[i]+=gi->second*dp[i-1]; dp[i]%=mod; } pos++; } pos--; for(int i=0;i<=pos&&i<=k;i++) { ans+=c(cnt,k-i)*dp[i]; ans%=mod; } cout<<ans<<endl; return 0;}