【问题背景】

  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. 阿冰教你一步一步做Android新闻客户端(二)两种异步线程加载图片的方法

    哈哈哈抱着没人看的心态随便写,直接上代码,各位看官看注释 一种Thread  一种AsyncTask 先不说用框架 public class ImageLoader { private ImageVi ...

  2. git命令(转载学习)

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是 ...

  3. 在使用反射时,maven设置依赖范围引起的异常

    背景是,运用annotation进行权限控制,将一个包下面的类.进行反射,然后判断类的annotation,根据annotation设置权限 问题来了,包下面有5个类,在反射时报了 javqx.ser ...

  4. jQuery 文本插入和标签移动方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. html 跨过CSRF验证

    /* CSRF配置 */function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection r ...

  6. 很有用的PHP笔试题系列二

    1.如何用php的环境变量得到一个网页地址的内容?ip地址又要怎样得到? Gethostbyname() echo $_SERVER ["PHP_SELF"];echo $_SER ...

  7. Java web service 异常

    1.org/apache/commons/discovery/tools/DiscoverSingleton Exception in thread "main" java.lan ...

  8. Java集合篇二:LinkList

    package com.test.collection; /** * 自定义实现LinkList * * 1.双向链表 * 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的 ...

  9. JavaScript (预热)

    希望把某个元素移除你的视线: 1.display:none;   显示为无 2.visibility:hidden; 隐藏 3.width\height; 4.透明度: 5.left\top; 6.拿 ...

  10. Stage6--Python简单爬虫

    正则表达式简单介绍 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 字符 ...