【问题背景】

  zhx 和妹子们玩数数游戏。

【问题描述】
  仅包含 4 或7 的数被称为幸运数。
  一个序列的子序列被定义为从序列中删去若干个数, 剩下的数组成的新序列。
  两个子序列被定义为不同的当且仅当其中的元素在原始序列中的下标的集合不
  相等。 对于一个长度为N的序列, 共有2^N个不同的子序列。包含一个空序列) 。
  一个子序列被称为不幸运的,当且仅当其中不包含两个相同的幸运数。
  对于一个给定序列, 求其中长度恰好为 K 的不幸运子序列的个数, 答案mod
  10^9+7输出。

【输入格式】
  第一行两个正整数N,K,表示原始序列的长度和题目中的 K。
  接下来一行N个整数ai,表示序列中第i 个元素的值。

【输出格式】
  仅一个数,表示不幸运子序列的个数。(mod

【样例输入】
  3 2
  1 1 1

【样例输出】

  3

【样例输入】
  4 2
  4 7 4 7

【样例输出】
  4

【样例解释】
对于样例 1,每个长度为 2的子序列都是符合条件的。
对于样例2, 4个不幸运子序列元素下标分别为: {1, 2}, {3, 4}, {1, 4}, {2, 3}。
注意下标集{1, 3}对应的子序列不是“不幸运”的,因为它包含两个相同的幸运数
4.

【数据规模与约定】
对于50%的数据,1 ≤ N≤ 16。
对于70%的数据,1 ≤ N≤ 1000, ai ≤ 10000。
对于100%的数据,1 ≤ N≤ 100000,K ≤ N, 1 ≤ ai ≤ 109。

这道题前70%的数据显然可以搜索

但是我一开始认为“仅包含4或仅包含7的数为幸运数”,然而竟过了50分

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define int long long
#define MOD 1000000007
#define N 1000100
int n,k,a[N];
int ans,path[N];
int ok[N][],vis[][];
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
inline void check(){
memset(vis,,sizeof(vis));
for(int i=;i<=k;i++){
int j=path[i];
if(!ok[j][]) continue;
if(vis[ok[j][]][ok[j][]]) return;
vis[ok[j][]][ok[j][]]=;
}
ans++;
}
void dfs(int minn,int t){
if(t==k+){
check();
return;
}
for(int i=minn;i<=n;i++){
path[t]=i;
dfs(i+,t+);
}
}
#undef int
int main()
#define int long long
{
scanf("%lld%lld",&n,&k);
if(n<=){
for(int i=;i<=n;i++){
a[i]=read();
int k=,b=a[i];
while(b%==){
b/=; k++;
}
if(k&&!b) {
ok[i][]=;
ok[i][]=; ok[i][]=k;
}
k=,b=a[i];
while(b%==){
b/=; k++;
}
if(k&&!b){
ok[i][]=;
ok[i][]=; ok[i][]=k;
}
}
dfs(,);
printf("%lld\n",ans);
return ;
}
return ;
}

我们考虑仅包含4或7的数,我们可以用map

其实数本身对本题是没有影响的,

只有每种相同幸运数的个数对答案产生影响

其实我一开始是想出了正解的一半的

一开始做题时的思路:枚举k个数中不幸运数的个数i,用组合数求出;

再求出从幸运数中每种不重地选择k-i个数的方案数,相乘

然而我并不会求后者,于是直接用C(num,k-i)乘了(num为出现的幸运数的总数)

然而它可以DP

f[i][j]表示前i中幸运数选j个数的方案数

lucky[i]表示第i种幸运数的个数

f[i][j]=f[i-1][j]+f[i-1][j-1]*lucky[i]

滚动数组可以降一维空间

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define int long long
#define MOD 1000000007
#define N 100010
map<int,int> M;
int n,k,jc[N];
int lucky[N],f[N],num,sum,ans;
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
inline int qpow(int x,int k){
int s=;
while(k){
if(k&) s=s*x%MOD;
k>>=;
x=x*x%MOD;
}
return s;
}
int C(int m,int n){
if(m<n) return ;
if(m==n) return ;
if(n>m-n) n=m-n;
int x=jc[m]*qpow(jc[m-n]*jc[n]%MOD,MOD-)%MOD;
return x;
}
#undef int
int main()
#define int long long
{
freopen("lucky10.in","r",stdin);
scanf("%lld%lld",&n,&k);
int x;
for(int i=;i<=n;i++){
x=read();
int k=,y=x;
while(y%==||y%==)
{ y/=; k++; }
if(k&&!y){
if(!M[x]){
lucky[++num]++;
M[x]=num;
}
else lucky[M[x]]++;
sum++;
}
}
f[]=;
for(int i=;i<=num;i++)
for(int j=min(k,i);j>=;j--)
f[j]=(f[j]+f[j-]*lucky[i])%MOD;
jc[]=;
for(int i=;i<=n;i++)
jc[i]=jc[i-]*i%MOD;
for(int i=;i<=k;i++)
ans=(ans+C(n-sum,i)*f[k-i]%MOD)%MOD;
printf("%lld\n",ans);
return ;
}

运lucky的更多相关文章

  1. Python自动化运维之路-01

    python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...

  2. [Tyvj 模拟赛] 运

    运 [问题背景] zhx和妹子们玩数数游戏. [问题描述] 仅包含4或7的数被称为幸运数. 一个序列的子序列被定义为从序列中删去若干个数,剩下的数组成的新序列.两个子序列被定义为不同的当且仅当其中的元 ...

  3. qbxt的题:运

    运 题意: 包含4,7的数成为幸运数.给一个序列,求多少个长度为k子序列满足:不包含两个及以上的相同的幸运数.(4出现两次就是不合法的,而4,7各出现一次是合法的). 分析: 1e9内幸运数只有2^1 ...

  4. IT运维监控解决方案介绍

    现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...

  5. 一切从“简”,解放IT运维人员

    运维人的神技 运维既是个技术活儿也是个苦差事,而运维人员被期望有着无限的技能:主机.存储.网络.操作系统样样精通,而且还要会写SQL.shell.开发语言java..net.python等等,对业务更 ...

  6. 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...

  7. IIS日志-网站运维的好帮手

    对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...

  8. 做linux运维工程师,必须要掌握以下几个工具

    linux系统如果是学习可以选用redhat或centos,特别是centos在企业中用得最多,当然还会有其它版本的,但学习者还是以这2个版本学习就行,因为这两个版本都是兄弟,没区别的,有空可以再研究 ...

  9. lucky 的 时光助理(2)

    lucky小姐说:昨天晚上他喝醉了,发消息说他想我了,说他后悔了. 我很惊讶. 我问lucky:你们很久都没有联系, 突然说... 你怎么想. 没错,'他'就是lucky的前男友. lucky看着我, ...

随机推荐

  1. 如何给MySql创建连接用户并授权

    一般在为MySql创建用户时建议使用GRANT前台命令,当然如果对我们开发者而言,方法还有很多种,比如使用INSERT命令,甚至是直接修改mysql user数据表,但仍然建议按照MySQL规范去授权 ...

  2. Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数

    目前,EF对存储过程的支持并不完善.存在以下问题: EF不支持存储过程返回多表联合查询的结果集. EF仅支持返回返回某个表的全部字段,以便转换成对应的实体.无法支持返回部分字段的情况. 虽然可以正常导 ...

  3. Csharp

    c#简介 c#程序结构 c#基本语法 c#数据类型 c#类型转换 c#变量 c#常量 c#运算符 c#判断 c#循环 c#方法 c#简介 C# 是一个现代的.通用的.面向对象的编程语言,它是由微软(M ...

  4. javascript学习:闭包和prototype原型使用基础

    闭包 function Person(name) { this.Username = name; var Userage = 18; //通过这种方法可以模拟私有成员 //类似于private成员 t ...

  5. python 对象属性与 getattr & setattr

    Python对象的属性可以通过obj.__dict__获得,向其中添加删除元素就可以实现python对象属性的动态添加删除的效果,不过我们应该使用更加正规的getattr和setattr来进行这类操作 ...

  6. csharp: ClientScript.RegisterStartupScript int net4.0

    //彈出提示 ClientScriptManager cs = Page.ClientScript; StringBuilder sb = new StringBuilder(); sb.Append ...

  7. Python爬虫《http和https协议》

    一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...

  8. css随堂笔记(三)

    Css随堂笔记(三) 1 关于背景图片   A 设置背景图片:background-image:url(“图片的路径”):   B 背景图片位置: background-position:1 方位名词 ...

  9. mardown文档的用法

    <hr>分割换行符<br>分隔符 <ul> <li></li></ul>无序标签 <ol><li>< ...

  10. learn OpenStack by picture