【问题背景】

zhx和妹子们玩数数游戏。

【问题描述】

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

【输入格式】

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

【输出格式】

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

【样例输入】

3 2 
1 1 1

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≤10^9。

此题比较水但是又略鬼畜...

首先我们可以发现一个幸运数一股子0/1串的味道...所以很显然对于 $10^9$ 之内的数据, 幸运数的数量只有 $1 \times 10^3$ 左右个. 所以我们第一可以选择打个表上去(重度懒癌患者表示还是直接打个数组表上去w), 第二可以选择DFS预处理一下, 然后将这些幸运数离散化. 离散化之后进行计数, 计算每个幸运数出现的次数 $cnt_i$ , 同时处理出非幸运数的个数 $d$ . 处理到这里我们已经成功将输入分成了两类, 然后需要分别来处理.

对于非幸运数随便瞎**挑够数就行, 然后非幸运数的部分就变成了一个组合问题. 我们枚举子序列中幸运数的个数 $i$ , 则非幸运数的个数为 $k-i$ , 与对应的幸运数部分相乘即可求得答案的一部分. 然后一直枚举 $i$ 即可得出答案. 公式如下:

\[ans=\sum_{i=1}^k {\binom{d}{k-i} \times f_i}\]

其中 $f_i$ 为从所有幸运数中取出 $i$ 个的方案数. 由于如果要保证子序列的非幸运性(???)的话, 幸运数的个数不能达到 $2$ , 也就是说每种要么取一个要么就不取, 然后我们似乎闻到了一股子0/1背包的味道所以我们可以将它转化成 $DP$ 来求. 对于 $C^d_{k-i}$ , 因为 $d$ 是固定的, 所以我们可以递推出一个组合数表出来. 当 $f_i$ 和 $\binom{d}{i}$ 两张表打好之后就可以算总答案辣w

参考代码

GitHub

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXM=;
const int MAXN=;
const long long p=1e9+;
const int lucky[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}; int n;
int k;
int unlucky;
long long c[MAXN];
long long dp[MAXN];
long long cnt[MAXN]; void Initialize();
void Combination();
void DynamicProgramming();
long long Pow(long long,int); int main(){
Initialize();
DynamicProgramming();
Combination();
long long ans=;
for(int i=;i<=k;i++)
ans=(ans+c[i]*dp[k-i]%p)%p;
printf("%lld\n",ans);
return ;
} void DynamicProgramming(){
dp[]=;
for(int i=;i<=MAXM;i++){
if(cnt[i]>=){
for(int j=i;j>;j--){
dp[j]=(dp[j]+dp[j-]*cnt[i])%p;
}
}
}
} void Combination(){
c[]=;
for(int i=;i<=unlucky;i++)
c[i]=c[i-]*(unlucky-i+)%p*Pow(i,p-)%p;
} void Initialize(){
int tmp;
scanf("%d%d",&n,&k);
unlucky=n;
for(int i=;i<n;i++){
scanf("%d",&tmp);
int pos=std::lower_bound(lucky,lucky+MAXM,tmp)-lucky;
if(lucky[pos]==tmp){
cnt[pos]++;
if(cnt[pos]==)
unlucky-=;
else if(cnt[pos]>)
unlucky--;
}
}
} long long Pow(long long a,int n){
long long ans=;
while(n>){
if((n&)!=){
ans=ans*a%p;
}
a=a*a%p;
n>>=;
}
return ans;
}

Backup

[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. mysql经典查询

    建立数据库 1.建立一个数据库 create database work; 2.进入数据库work use work; 3.数据库默认编码可能不支持中文,可以在这里设置下 set names gbk; ...

  2. Python(1):入门

    安装: 在linux中一般都自带有python2.7的版本,如果想升级python到最新的版本可以参考其他博客(http://www.cnblogs.com/lanxuezaipiao/archive ...

  3. 【TCP协议详解】

    为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...

  4. 编译android源码遇到错误及其解决方法

    升级ubuntu的14.04后,android的源码又编译错误了,一下是错误说明赫解决方法: 1.make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_ ...

  5. Rust by Example1

    最近在学习Rust,想通过这个记录一下学习过程 首先是老规矩:HelloWorld // Rust单行注释 /// 文档注释 /*     多行注释 */ fn main() {     // 这是个 ...

  6. 根据Time Protocol从NIST Internet Time Servers获取准确时间

    Time Protocol(RFC-868)是一种非常简单的应用层协议:它返回一个32位的二进制数字,这个数字描述了从1900年1月1日0时0分0秒到现在的秒数,服务器在TCP的37号端口监听时间协议 ...

  7. Java - 将可变性最小化

    不可变类,即实例不能被修改的类,实例中包含的所有信息在对象的生命周期内固定不变. 常见的比如String.基本类型的封装类.BigDecimal.BigInteger. 相对与可变类,不可变更易于设计 ...

  8. spring boot2 使用log4j2

    spring boot默认使用的是logback,看到好多地方说logback比log4j耗性能,具体么我也没试过,不过个人还是log4j用得更多. 先看pom依赖 <dependency> ...

  9. Bzoj2780: [Spoj]8093 Sevenk Love Oimaster

    题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护 \(parent\)树上启发式合并一下就好了 # include <bits/stdc++.h& ...

  10. 新版qq canvas 动态背景

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