题目

【问题背景】
zhx 和妹子们玩数数游戏。

【问题描述】

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

INPUT

第一行两个正整数 N, K, 表示原始序列的长度和题目中的K。

接下来一行 N 个整数 ai, 表示序列中第 i 个元素的值。

OUTPUT

仅一个数,表示不幸运子序列的个数。(mod 10^9+7)

SAMPLE

INPUT1

3 2
1 1 1

OUTPUT1

3

INPUT2

4 2
4 7 4 7

OUTPUT2

4

数据规模与约定

对于50%的数据, 1 ≤N ≤ 16。

对于70%的数据, 1 ≤ N ≤ 1000, ai ≤ 10000。

对于100%的数据, 1 ≤ N ≤ 100000,K ≤ N, 1 ≤ ai ≤ 109。

解题报告

考试时打了dfs,本来以为能打前50分,结果读错题+打挂了,只拿了20= =

正解:

首先,我们想,幸运数在数据范围内最多有1022个(正确性显然,我们可以轻易地知道,在一位数中,幸运数只有4和7,而两位数中,幸运数有44,47,74,77,我们看出,其实幸运数就是由4和7组合出来的,废话,题目就是这么定义的,所以,在n位数中,就有2^n个幸运数,而显然,幸运数在数据范围内只能到9位,等比数列求和得到1022)。

那么我们可以预处理出来,我用的是dfs,然后我们就拥有了所有的幸运数,随便离散一下什么的,我们就成功的打出了一个表。

对于剩下不是幸运数的d个数来说,这就是个组合问题。所以总方案数为

对于calc,随便dp一下就好了(可以当成01背包来做,很简单的,可以压成一维)

至于组合数,我们可以递推地求

(update:应某司机要求,讲一下如何递推地求组合数。)

我们知道

那么我们就有

这就是我们的递推式,并且我们知道

这就是我们的递推边界

剩下的,要注意,在模意义下的除法,是需要求逆元的

然后就很easy了

(update over)

具体看代码吧= =

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
typedef long long L;
const L mod();
L n,k;
L n1;
L cnt,luc[];
inline void dfs(int dep,int x){
if(x)
luc[++cnt]=x;
if(dep==)
return;
dfs(dep+,x*+);
dfs(dep+,x*+);
}
L sum[];
L f[],c[];
inline L pw(L x,L p){
L ret();
while(p){
if(p&)
ret=(ret*x)%mod;
x=(x*x)%mod;
p>>=;
}
return ret;
}
int main(){
dfs(,);
sort(luc+,luc+cnt+);
n=read(),k=read();
n1=n;
for(int i=;i<=n;i++){
int a(read());
int pos(lower_bound(luc+,luc+cnt+,a)-luc);
if(luc[pos]==a){
sum[pos]++;
if(sum[pos]==)
n1-=;
if(sum[pos]>)
n1--;
}
}
c[]=f[]=;
for(int i=;i<=cnt;i++)
if(sum[i]>=)
for(int j=i;j>;j--)
f[j]=(f[j]+f[j-]*sum[i])%mod;
for(int i=;i<=n1;i++)
c[i]=c[i-]*(n1-i+)%mod*pw(i,mod-)%mod;
L ans();
for(int i=;i<=k;i++)
ans=(ans+c[i]*f[k-i]%mod)%mod;
printf("%lld",ans);
}

[Tyvj模拟赛]运的更多相关文章

  1. [Tyvj 模拟赛] 运

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

  2. noip模拟赛 运

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

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  7. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  8. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  9. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

随机推荐

  1. WCF学习——构建一个简单的WCF应用(二)

    我们接着上一篇文章进行讲解 http://www.cnblogs.com/songjianhui/p/7060698.html 一:客户端通过添加引用调用服务 WCF应用服务被成功寄宿后,WCF服务应 ...

  2. java源码学习(五)LinkedList

    LinkedList [TOC] 一.定义 public class LinkedList<E> extends AbstractSequentialList<E> imple ...

  3. fastJson将json字符串转换为map

    public class JsonUtil { /** * 将json转化成map * @param jsonStr * @return */ public static Map<String, ...

  4. oracle创建数据库表空间 用户 授权 导入 导出数据库

    windows下可以使用向导一步一步创建数据库,注意编码. windows连接到某一个数据库实例(不然会默认到一个实例下面):set ORACLE_SID=TEST --登录开始创建表空间及可以操作的 ...

  5. 根据list得到list中的最大值最小值

    List ll = new ArrayList(); ll.add(new BigDecimal(1)); ll.add(new BigDecimal(4.99)); ll.add(new BigDe ...

  6. Redis的安装与使用(单节点)

    IP:192.168.4.111 环境:CentOS 6.6 Redis版本:redis-3.0 (考虑到Redis3.0在集群和性能提升方面的特性,rc版为正式版的候选版,而且很快就出正式版) 安装 ...

  7. linux虚拟机下安装samba

    默认情况下,Linux系统在默认安装中已经安装了Samba服务包的一部分 ,为了对整个过程有一个完整的了解,在此先将这部分卸载掉.使用命令 rpm -qa | grep samba ,默认情况下可以查 ...

  8. python编程快速上手之第4章实践项目参考答案

    #!/usr/bin/env python3.5 # coding:utf-8 # 假定有一个列表,编写函数以一个列表值作为参数,返回一个字条串 # 该字符串包含所有表项,之间以逗号和空格分隔,并在最 ...

  9. 《Java编程思想》第一二章

    前段时间一直通过网络教程学习Java基础,把面向对象部分学完之后本来打算继续深入学习,但是感觉自己操之过急了,基础根本不够扎实,所以入手了一本<Java编程思想>,希望先把基础打好,再深入 ...

  10. C# Lambda表达式运用

    原文作者: C# Lambda表达式 原文作者2: Lambda表达式详解 Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lamb ...