【问题背景】

  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. 发送请求时params和data的区别

    在使用axios时,注意到配置选项中包含params和data两者,以为他们是相同的,实则不然. 因为params是添加到url的请求字符串中的,用于get请求. 而data是添加到请求体(body) ...

  2. java开发中的设计模式

    http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五 ...

  3. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...

  4. 前台通过ajax获取后台数据,PHP如何返回中文数据

    现在经常使用Ajax调用后台php获取后台数据,但是PHP返回的数据如果含有中文的话,Ajax会无法识别,那咋整呢,我用的是比较笨的方法,但是实用: 方法一: echo urldecode(json_ ...

  5. winform代码生成器(二)

    代码下载 地址 http://pan.baidu.com/s/1nuZjyat 接着说 上文继续说,这次我们要生成主从表. 此方用到了第三方的 控件 DevExpress 的Gridview .大家可 ...

  6. 再写一篇ubuntu服务器的环境配置文

    三年前写过一篇,但是环境和三年前比已经发生了比较大的变化,于是重新写一篇,自己以后再次配置也比较方便.我个人而言并没有觉得centos比ubuntu好用多少,所以继续选用ubuntu. 一.硬盘分区  ...

  7. Socket编程指南及示例程序(转)

    1         前言 在一些常用的编程技术中,Socket网络编程可以说是最简单的一种.而且Socket编程需要的基础知识很少,适合初学者学习网络编程.目前支持网络传输的技术.语言和工具繁多,但是 ...

  8. python dict list tuple

    Dict 创建 somedict = {} somedict = {"key": value} a = dict(one=1, two=2, three=3) c = dict(z ...

  9. Please, configure Web Facet first!idea报这错的解决办法!!

    Please, configure Web Facet first!idea报这错的解决办法!! 今天在idea导入用eclipse的项目,然后运行项目的时候报这个错, 看下图 网上找了好多都没解决, ...

  10. 如何获得ImageView中的图像

    我们知道在Android中ImageView是一个用于显示图像的控件,比如在很多联系人方面的应用中,需要为联系人拍摄头像,并将得到的头像放在一个 ImageView对象中显示.通常,在没有为联系人拍摄 ...