【问题背景】

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <iostream>
  5. #include <algorithm>
  6.  
  7. const int MAXM=;
  8. const int MAXN=;
  9. const long long p=1e9+;
  10. const int lucky[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
  11.  
  12. int n;
  13. int k;
  14. int unlucky;
  15. long long c[MAXN];
  16. long long dp[MAXN];
  17. long long cnt[MAXN];
  18.  
  19. void Initialize();
  20. void Combination();
  21. void DynamicProgramming();
  22. long long Pow(long long,int);
  23.  
  24. int main(){
  25. Initialize();
  26. DynamicProgramming();
  27. Combination();
  28. long long ans=;
  29. for(int i=;i<=k;i++)
  30. ans=(ans+c[i]*dp[k-i]%p)%p;
  31. printf("%lld\n",ans);
  32. return ;
  33. }
  34.  
  35. void DynamicProgramming(){
  36. dp[]=;
  37. for(int i=;i<=MAXM;i++){
  38. if(cnt[i]>=){
  39. for(int j=i;j>;j--){
  40. dp[j]=(dp[j]+dp[j-]*cnt[i])%p;
  41. }
  42. }
  43. }
  44. }
  45.  
  46. void Combination(){
  47. c[]=;
  48. for(int i=;i<=unlucky;i++)
  49. c[i]=c[i-]*(unlucky-i+)%p*Pow(i,p-)%p;
  50. }
  51.  
  52. void Initialize(){
  53. int tmp;
  54. scanf("%d%d",&n,&k);
  55. unlucky=n;
  56. for(int i=;i<n;i++){
  57. scanf("%d",&tmp);
  58. int pos=std::lower_bound(lucky,lucky+MAXM,tmp)-lucky;
  59. if(lucky[pos]==tmp){
  60. cnt[pos]++;
  61. if(cnt[pos]==)
  62. unlucky-=;
  63. else if(cnt[pos]>)
  64. unlucky--;
  65. }
  66. }
  67. }
  68.  
  69. long long Pow(long long a,int n){
  70. long long ans=;
  71. while(n>){
  72. if((n&)!=){
  73. ans=ans*a%p;
  74. }
  75. a=a*a%p;
  76. n>>=;
  77. }
  78. return ans;
  79. }

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. String类的substring方法

    下列程序的输出是什么? class A { public static void main(String[] a) {     String v = “base”;      v.concat(“ba ...

  2. C/C++中字符串与数字转换

    本文总结了四种字符串和数字相互转换的方法,方法一和方法二是c++中的方法,方法三和方法四是C语言库函数的方法. 方法一:c++11中string中添加了下面这些方法帮助完成字符串和数字的相互转换 st ...

  3. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment avariable and mvn script match.

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  4. js 页面间的通信

    看了一下公司原来的代码,原页面ajax post返回一个页面完整的HTML,然后再打开一个新页面并输出ajax返回的所有代码到新页面上,在新页面上以表单提交的形式实现重定向. 任凭我想了半天也没想出来 ...

  5. CountDownLatch 使用(模拟一场比赛)

    java.util.concurrency中的CountDownLatch,主要用于等待一个或多个其他线程完成任务.CountDownLatch在初始化时,会被赋一个整数,每次执行countDown( ...

  6. R语言中apply函数

    前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...

  7. Chart图表整合——面积对比图、扇形图、柱状图

    一. chart图表demo网址 网址:http://antv.alipay.com/zh-cn/f2/3.x/demo/index.html 二. 本文主要对面积对比图,扇形图,柱状图三大常见图进行 ...

  8. 学会了ES6,就不会写出那样的代码

    用let不用var ES6之前我们用var声明一个变量,但是它有很多弊病: 因为没有块级作用域,很容易声明全局变量 变量提升 可以重复声明 还记得这道面试题吗? var a = []; for (va ...

  9. 如何快速备份还原Sql Server 数据库

    备份数据库 选择你要备份的数据库,鼠标右键单击,选择任务-备份 弹出备份数据库窗口,选择添加 弹出选择备份目标窗口,点击浏览,选择存放备份数据库的目录,输入文件名,后缀名输入.bak,点击确定,确定, ...

  10. 《Centos服务器版安装教程》

    安装前准备: (1)  首先大家需要在电脑上安装一个VMware (2)  Centos7系列的一个服务器版镜像 有了这两样东西,下面我们就开始安装了 一.     打开VMware,新建一个虚拟机 ...