题目

【问题背景】
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)

具体看代码吧= =

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 inline int read(){
 7     int sum(0);
 8     char ch(getchar());
 9     for(;ch<'0'||ch>'9';ch=getchar());
10     for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
11     return sum;
12 }
13 typedef long long L;
14 const L mod(1000000007);
15 L n,k;
16 L n1;
17 L cnt,luc[1031];
18 inline void dfs(int dep,int x){
19     if(x)
20         luc[++cnt]=x;
21     if(dep==10)
22         return;
23     dfs(dep+1,x*10+4);
24     dfs(dep+1,x*10+7);
25 }
26 L sum[1031];
27 L f[100001],c[100001];
28 inline L pw(L x,L p){
29     L ret(1);
30     while(p){
31         if(p&1)
32             ret=(ret*x)%mod;
33         x=(x*x)%mod;
34         p>>=1;
35     }
36     return ret;
37 }
38 int main(){
39     dfs(1,0);
40     sort(luc+1,luc+cnt+1);
41     n=read(),k=read();
42     n1=n;
43     for(int i=1;i<=n;i++){
44         int a(read());
45         int pos(lower_bound(luc+1,luc+cnt+1,a)-luc);
46         if(luc[pos]==a){
47             sum[pos]++;
48             if(sum[pos]==2)
49                 n1-=2;
50             if(sum[pos]>2)
51                 n1--;
52         }
53     }
54     c[0]=f[0]=1;
55     for(int i=1;i<=cnt;i++)
56         if(sum[i]>=2)
57             for(int j=i;j>0;j--)
58                 f[j]=(f[j]+f[j-1]*sum[i])%mod;
59     for(int i=1;i<=n1;i++)
60         c[i]=c[i-1]*(n1-i+1)%mod*pw(i,mod-2)%mod;
61     L ans(0);
62     for(int i=0;i<=k;i++)
63         ans=(ans+c[i]*f[k-i]%mod)%mod;
64     printf("%lld",ans);
65 }

View Code

转载于:https://www.cnblogs.com/hzoi-mafia/p/7286310.html

[Tyvj模拟赛]运相关推荐

  1. 第十三届蓝桥杯模拟赛(第三期)试题与题解 C++

    文章目录 第十三届蓝桥杯模拟赛(第三期)试题与题解 1.试题A 题解:数制转换 2.试题B 题解:枚举 3.试题C 题解:枚举 4.试题D 题解:最小生成树 5.试题E 方法一:暴力求和 方法二:一维 ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  4. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  5. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  7. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】

    蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料)   提取码:6666 2013年 ...

  8. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

最新文章

  1. PySpider HTTP 599: SSL certificate problem错误的解决方法
  2. 理解 Go defer
  3. python下载文件的几种常用方法
  4. 详解MySQL查询缓存
  5. 致盗窃,抄袭有三AI内容以及不可理喻的读者
  6. 三十八、练习、Python判断一个信用卡号是否合理
  7. oracle 11gr2 bbed 安装,oracle11gR2 安装bbed工具
  8. 自动处理键盘事件的第三方库 IQKeyboardManager
  9. 白嫖一时爽,一直白嫖......?
  10. oracle参数错误,解决oracle参数系统文件出错
  11. Java程序调用OpenDDS
  12. 学习Python编程看哪些书比较好?推荐这10本
  13. Dango 之 Xadmin
  14. 目前四种swift代码格式化工具
  15. 详解TCP/IP协议栈面临的五大网络安全问题
  16. poj 2942 点双连通分量
  17. js实现,点击侧边导航栏,可以平缓的跳到界面指定位置,同时当界面某个元素在浏览器可视范围的时候,相应的导航栏也显示相应的样式
  18. git: cherry-pick
  19. spark官网首页翻译
  20. Lua 起航 —— 一些常用基础语法

热门文章

  1. Thunderbolt是什么
  2. 蹲下突然站起来总是会头晕,是什么原因?
  3. “华为”和“荣耀”手机有什么区别?
  4. 现在很多人都做自媒体,谈谈个人的一些想法
  5. 谈判中,要学会“留一手”
  6. 两大思维,就可以让你轻松完成任意一个目标
  7. 老板要先想明白三件事
  8. 移动互联网将向“全真互联网”升级
  9. Qt4_子类化QMainWindow
  10. Qt4_组装丰富的积木