【问题背景】

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. ThreadPoolExecutor 杂记

    When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are ru ...

  2. selector.select()和selector.selectedKeys()

    当调用selector.select()时会阻塞: This method performs a blocking selection operation. It returns only after ...

  3. DIY党的福利!鹅厂程序员教你200元以内制作专属分体键盘

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由VellHe发表于云+社区专栏 前言 作为一名程序员,键盘在手,天下我有啊,不整把高大上的键盘怎么提升B格.之前一直想买个机械键盘,听 ...

  4. To B服务想做移动化?腾讯云案例了解一下

    本文由 腾讯云助手团队 发布于 腾讯云云+社区 | 导语:腾讯云那么多资源和服务,就不能手机管理吗? 能. 当用户在使用To B服务时,往往会遇到各种各样的限制: 1.操作难度:涉及各种权限.多重验证 ...

  5. Thinking in java(1):对象导论

    纯粹的面向对象程序设计的几个特性:1. 万物皆对象2. 程序是对象的合集,他通过发消息告诉彼此要做什么3. 每个对象都有自己的由其他对象所构成的存储4. 每个对象都有其类型5. 某一特定类型的所有对象 ...

  6. CentOS下安装Redis(转载)

    Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...

  7. Docker学习(六): 网络使用与配置

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  8. [C语言] 数据结构-预备知识指针

    所有的伟大源于一个勇敢的开始 数据结构预备知识 指针 1.指针:是C语言的灵魂,指针=地址 地址:内存单元的编号 指针变量:存放内存单元地址的变量 int *p;//p是指针变量,int *表示该p变 ...

  9. 一:Bootstrap-css样式

    页面大块布局: div.container 栅格系统: 一行分成 12 列 div.row div.col-md-12 div.col-xs-12 <div class="row&qu ...

  10. 最新sublime Text3 注册激活码

    sublime build 3103注册码 Enter License -- BEGIN LICENSE --Ryan ClarkSingle User LicenseEA7E-8124792158A ...