CF145C Lucky Subsequence
题目链接:
洛谷
Codeforces
Problem
这题目翻译真的神了,好多歧义,看不懂,给一个本人翻译:
给你一个长度为
- 长度为
。 - 不能出现相同的幸运数,即最多
次,其它数可出现任意次数。
问有多少种取法,对
Solution
计数题,首先要想好策略,这题只有两种数,所以肯定是枚举其中一种数的个数。
对于幸运数,其数量显然不会很多,所以设
其中
对于非幸运数,直接组合数就可以了。
令
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
void read(int &x)
{
char ch=getchar();
int r=0,w=1;
while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))r=(r<<1)+(r<<3)+(ch^48),ch=getchar();
x=r*w;
}
const int N=1e5+7,mod=1e9+7;
int f[N],s[N],cnt,p[N];
map<int,int>mp;
void init()
{
p[0]=1;
for(int i=1;i<=1e5;i++)p[i]=p[i-1]*i%mod;
}
int Pow(int x,int y)
{
int ans=1;
while(y)
{
if(y&1)ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
int C(int n,int m)
{
if(m==0)return 1;
if(n<m)return 0;
return p[n]*Pow(p[m],mod-2)%mod*Pow(p[n-m],mod-2)%mod;
}
bool check(int x)
{
while(x)
{
if(x%10!=4&&x%10!=7)return false;
x/=10;
}
return true;
}
main()
{
init();
int n,k,t=0;
read(n);read(k);
for(int i=1,x;i<=n;i++)
{
read(x);
if(check(x))
{
if(!mp[x])mp[x]=++cnt;
s[mp[x]]++;
}
else t++;
}
f[0]=1;
for(int i=1;i<=cnt;i++)
for(int j=cnt;j>=1;j--)
f[j]=(f[j]+f[j-1]*s[i]%mod)%mod;
int ans=0;
for(int i=0;i<=k;i++)
ans=(ans+f[i]*C(t,k-i)%mod)%mod;
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端