运lucky
运
【问题背景】
zhx 和妹子们玩数数游戏。
【问题描述】
仅包含 4 或7 的数被称为幸运数。
一个序列的子序列被定义为从序列中删去若干个数, 剩下的数组成的新序列。
两个子序列被定义为不同的当且仅当其中的元素在原始序列中的下标的集合不
相等。 对于一个长度为N的序列, 共有2^N个不同的子序列。包含一个空序列) 。
一个子序列被称为不幸运的,当且仅当其中不包含两个相同的幸运数。
对于一个给定序列, 求其中长度恰好为 K 的不幸运子序列的个数, 答案mod
10^9+7输出。
【输入格式】
第一行两个正整数N,K,表示原始序列的长度和题目中的 K。
接下来一行N个整数ai,表示序列中第i 个元素的值。
【输出格式】
仅一个数,表示不幸运子序列的个数。(mod
【样例输入】
3 2
1 1 1
【样例输出】
3
【样例输入】
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 ≤ 109。
这道题前70%的数据显然可以搜索
但是我一开始认为“仅包含4或仅包含7的数为幸运数”,然而竟过了50分
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define int long long
#define MOD 1000000007
#define N 1000100
int n,k,a[N];
int ans,path[N];
int ok[N][],vis[][];
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
inline void check(){
memset(vis,,sizeof(vis));
for(int i=;i<=k;i++){
int j=path[i];
if(!ok[j][]) continue;
if(vis[ok[j][]][ok[j][]]) return;
vis[ok[j][]][ok[j][]]=;
}
ans++;
}
void dfs(int minn,int t){
if(t==k+){
check();
return;
}
for(int i=minn;i<=n;i++){
path[t]=i;
dfs(i+,t+);
}
}
#undef int
int main()
#define int long long
{
scanf("%lld%lld",&n,&k);
if(n<=){
for(int i=;i<=n;i++){
a[i]=read();
int k=,b=a[i];
while(b%==){
b/=; k++;
}
if(k&&!b) {
ok[i][]=;
ok[i][]=; ok[i][]=k;
}
k=,b=a[i];
while(b%==){
b/=; k++;
}
if(k&&!b){
ok[i][]=;
ok[i][]=; ok[i][]=k;
}
}
dfs(,);
printf("%lld\n",ans);
return ;
}
return ;
}
我们考虑仅包含4或7的数,我们可以用map
其实数本身对本题是没有影响的,
只有每种相同幸运数的个数对答案产生影响
其实我一开始是想出了正解的一半的
一开始做题时的思路:枚举k个数中不幸运数的个数i,用组合数求出;
再求出从幸运数中每种不重地选择k-i个数的方案数,相乘
然而我并不会求后者,于是直接用C(num,k-i)乘了(num为出现的幸运数的总数)
然而它可以DP
f[i][j]表示前i中幸运数选j个数的方案数
lucky[i]表示第i种幸运数的个数
f[i][j]=f[i-1][j]+f[i-1][j-1]*lucky[i]
滚动数组可以降一维空间
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define int long long
#define MOD 1000000007
#define N 100010
map<int,int> M;
int n,k,jc[N];
int lucky[N],f[N],num,sum,ans;
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
inline int qpow(int x,int k){
int s=;
while(k){
if(k&) s=s*x%MOD;
k>>=;
x=x*x%MOD;
}
return s;
}
int C(int m,int n){
if(m<n) return ;
if(m==n) return ;
if(n>m-n) n=m-n;
int x=jc[m]*qpow(jc[m-n]*jc[n]%MOD,MOD-)%MOD;
return x;
}
#undef int
int main()
#define int long long
{
freopen("lucky10.in","r",stdin);
scanf("%lld%lld",&n,&k);
int x;
for(int i=;i<=n;i++){
x=read();
int k=,y=x;
while(y%==||y%==)
{ y/=; k++; }
if(k&&!y){
if(!M[x]){
lucky[++num]++;
M[x]=num;
}
else lucky[M[x]]++;
sum++;
}
}
f[]=;
for(int i=;i<=num;i++)
for(int j=min(k,i);j>=;j--)
f[j]=(f[j]+f[j-]*lucky[i])%MOD;
jc[]=;
for(int i=;i<=n;i++)
jc[i]=jc[i-]*i%MOD;
for(int i=;i<=k;i++)
ans=(ans+C(n-sum,i)*f[k-i]%MOD)%MOD;
printf("%lld\n",ans);
return ;
}
运lucky的更多相关文章
- Python自动化运维之路-01
python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...
- [Tyvj 模拟赛] 运
运 [问题背景] zhx和妹子们玩数数游戏. [问题描述] 仅包含4或7的数被称为幸运数. 一个序列的子序列被定义为从序列中删去若干个数,剩下的数组成的新序列.两个子序列被定义为不同的当且仅当其中的元 ...
- qbxt的题:运
运 题意: 包含4,7的数成为幸运数.给一个序列,求多少个长度为k子序列满足:不包含两个及以上的相同的幸运数.(4出现两次就是不合法的,而4,7各出现一次是合法的). 分析: 1e9内幸运数只有2^1 ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- 一切从“简”,解放IT运维人员
运维人的神技 运维既是个技术活儿也是个苦差事,而运维人员被期望有着无限的技能:主机.存储.网络.操作系统样样精通,而且还要会写SQL.shell.开发语言java..net.python等等,对业务更 ...
- 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)
马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...
- IIS日志-网站运维的好帮手
对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...
- 做linux运维工程师,必须要掌握以下几个工具
linux系统如果是学习可以选用redhat或centos,特别是centos在企业中用得最多,当然还会有其它版本的,但学习者还是以这2个版本学习就行,因为这两个版本都是兄弟,没区别的,有空可以再研究 ...
- lucky 的 时光助理(2)
lucky小姐说:昨天晚上他喝醉了,发消息说他想我了,说他后悔了. 我很惊讶. 我问lucky:你们很久都没有联系, 突然说... 你怎么想. 没错,'他'就是lucky的前男友. lucky看着我, ...
随机推荐
- Android 软件自动更新功能实现的方法
相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能 首先看一下程序目录结构 步骤: 1.新建一个类UpdateManger,用于显示提示更新 详细出处参考:http://www.jb51.n ...
- Unity5.x发布IOS项目Xcode8免签证调试发布教程
https://www.jianshu.com/p/b0fb49fbcc14 最近尝试发布一下IOS项目,发现现在发布已经简单很多了,不需要开发者账户也能简单快捷进行真机调试. 调试: 1.准备工作 ...
- C++ Memory System Part1: new和delete
在深入探索自定义内存系统之前,我们需要了解一些基础的背景知识,这些知识点是我们接下来自定义内存系统的基础.所以第一部分,让我们来一起深入了解一下C++的new和delete家族,这其中有很多令人吃惊的 ...
- Java网络编程二
向web站点发送get post请求,并从web站点取得响应 通相应的set方法,在调用connect()方法前,可以设置请求的各种参数,实现同浏览器类似的访问,调用connect()后可以调用相应的 ...
- linux修改文件权限命令(chmod)
chmod命令是用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限. 该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1.文字设定法 chmod ...
- html5可拖动的进度条
总结:拖动显示进度的进度条 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- hibernate事务管理 (jdbc jta)
hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...
- 火狐浏览器 firebug调试不能载入javascript
用 firebug 调试时:本页面不包含 javascript 原因:火狐浏览器版本高了 解决:下载火狐49,关闭自动更新
- 【Linux】Windows与Linux之间的文件共享(基于网络)
切记:Linux的安全机制的存在--iptables和selinux. 一.操作前提 1.1 从Windows能够ping通Linux 1.2 关闭Linux防火墙 command1:/etc/ini ...
- 【起航计划 036】2015 起航计划 Android APIDemo的魔鬼步伐 35 App->Service->Messenger Service Messenger实现进程间通信
前面LocalService 主要是提供同一Application中组件来使用,如果希望支持不同应用或进程使用Service.可以通过Messenger.使用Messgener可以用来支持进程间通信而 ...