【问题背景】

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. ibatis实现批处理

    最近做一个小项目,用到Spring+iBatis.突然遇到一个很久远,却很实在的问题:在Spring下怎么使用iBatis的批处理实现? 大概是太久没有写Dao了,这部分真的忘得太干净了. 从4个层面 ...

  2. FocusBI:租房分析&星型模型

    微信公众号:FocusBI关注可了解更多的商业智能.数据仓库.数据库开发.爬虫知识及沪深股市数据推送.问题或建议,请关注公众号发送消息留言;如果你觉得FocusBI对你有帮助,欢迎转发朋友圈或在文章末 ...

  3. 样式styles和主题theme

    参考资料:http://blog.csdn.net/sshhbb/article/details/7219838/ /values/styles.xml <resources> <! ...

  4. Linux du查询文件大小

    #查询磁盘当前容量信息 $df -h   #查询当前目录下所有文件的大小 $du -m .   #两种方式查询 仅当前目录下的子文件(文件夹)大小 $du -sh /cloud/*   $du -h ...

  5. AngularJs ng-repeat重复项异常解决方案

    ng-repeat="v in arr track by $index" <!DOCTYPE html> <html lang="en"> ...

  6. c#尽量使用条件属性(Conditional Attribute)

    至此我们应该对Attribute属性大体了解了.下面来看看条件属性(Conditional Attribute)到底是怎么回事. 1 [Conditional("DEBUG")]  ...

  7. Groovy中String转换Gstring用于动态插值

    知识点是Groovy中的模板引擎 GStringTemplateEngine 第一个例子: def binding = [ firstname : "Grace", lastnam ...

  8. PowerDesigner16导出SQL时如何添加注释

    添加注释方法 https://jingyan.baidu.com/article/47a29f24652e44c0142399c3.html 重点是修改value的值 alter table [%QU ...

  9. Generator函数自执行

    Generator函数实现 function* gen(x){ var y = yield x + 2; return y } //1.调用g函数会返回一个内部的指针 var g = gen(1); ...

  10. C# 字符串中英文对齐

    StringBuilder str = new StringBuilder(); str.AppendFormat( - Encoding.Default.GetBytes(); str.Append ...