/ Randle /

记录详情

Accepted


  
# 状态 耗时 内存占用
#1 Accepted 3ms 340.0 KiB
#2 Accepted 3ms 420.0 KiB
#3 Accepted 2ms 360.0 KiB
#4 Accepted 3ms 256.0 KiB
#5 Accepted 3ms 436.0 KiB
#6 Accepted 4ms 372.0 KiB
#7 Accepted 2ms 348.0 KiB
#8 Accepted 10ms 384.0 KiB
#9 Accepted 33ms 740.0 KiB
#10 Accepted 50ms 752.0 KiB

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e3+30;
const int MOD=1e9+7;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int n,k,a,n1,n2;
ll luc[M],cnt=0,sum[M];
void dfs(int d,ll now){
    if(now) luc[++cnt]=now;
    if(d==10) return;
    dfs(d+1,now*10+4);
    dfs(d+1,now*10+7);
}
ll f[N],c[N];
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
    if(b==0) {d=a;x=1;y=0;}
    else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}
ll inv(ll a,ll n){
    ll d,x,y;
    exgcd(a,n,d,x,y);
    return d==1?(x+n)%n:-1;
}
void dp(){
    f[0]=1;
    for(int i=1;i<=cnt;i++) if(sum[i]>=2)
        for(int j=i;j>=1;j--)
            f[j]=(f[j]+f[j-1]*sum[i]%MOD)%MOD;
    
    c[0]=1;
    for(int i=1;i<=n1;i++)
        c[i]=c[i-1]*(n1-i+1)%MOD*inv(i,MOD)%MOD;
}
int main(){
    n=read();k=read();
    n1=n;
    dfs(1,0);
    sort(luc+1,luc+1+cnt);
    for(int i=1;i<=n;i++){
        a=read();
        int p=lower_bound(luc+1,luc+1+cnt,a)-luc;
        if(luc[p]==a){
            sum[p]++;    //sum[p]==1  regard as unlucky
            if(sum[p]==2) n2++,n1-=2;
            if(sum[p]>2) n1--;
        }
    }
    dp();
    ll ans=0;
    for(int i=0;i<=k;i++) ans=(ans+c[i]*f[k-i]%MOD)%MOD;
    printf("%lld",ans);
}

信息

递交者
类型
递交
题目
幸运数 T3
题目数据
下载
语言
C++
递交时间
2018-04-17 20:01:49
评测时间
2018-04-17 20:01:49
评测机
分数
100
总耗时
118ms
峰值内存
752.0 KiB