题目描述

Petya loves lucky numbers very much. Everybody knows that lucky numbers are positive integers whose decimal record contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Petya has sequence aa consisting of nn integers.

The subsequence of the sequence aa is such subsequence that can be obtained from aa by removing zero or more of its elements.

Two sequences are considered different if index sets of numbers included in them are different. That is, the values ​of the elements ​do not matter in the comparison of subsequences. In particular, any sequence of length nn has exactly 2^{n}2n different subsequences (including an empty subsequence).

A subsequence is considered lucky if it has a length exactly kk and does not contain two identical lucky numbers (unlucky numbers can be repeated any number of times).

Help Petya find the number of different lucky subsequences of the sequence aa . As Petya's parents don't let him play with large numbers, you should print the result modulo prime number 10000000071000000007 (10^{9}+7)(109+7) .

输入输出格式

输入格式:

 

The first line contains two integers nn and kk (1<=k<=n<=10^{5})(1<=k<=n<=105) . The next line contains nn integers a_{i}ai​ ( 1<=a_{i}<=10^{9}1<=ai​<=109 ) — the sequence aa .

 


输出格式:

 

On the single line print the single number — the answer to the problem modulo prime number 10000000071000000007 (10^{9}+7)(109+7) .

 

输入输出样例

输入样例#1: 

3 2
10 10 10
输出样例#1: 

3
输入样例#2: 

4 2
4 4 7 7
输出样例#2: 

4

说明

In the first sample all 3 subsequences of the needed length are considered lucky.

In the second sample there are 4 lucky subsequences. For them the sets of indexes equal (the indexation starts from 1 ): {1,3}1,3 , {1,4}1,4 , {2,3}2,3 and {2,4}2,4 .

题意:

定义神仙数为只含4和7的数字

给出n个数字,让你从里面取k个,同一个神仙数不能重复取,求取法数

题解

首先如果没有重复取这个限制,这就是一道线性求组合数。

就算有这个限制,全部不能重复取也是可做的,所以自然会感觉这种部分可重复部分不能的题很难受,于是会想到将原来的数组拆成两组,一组只有神仙数,一组只有非神仙数

然后答案就是在神仙数中取i个,在非神仙数中取k-i个的方案相乘,再将i=1~n的所有方案相加起来,就是答案

非神仙数显然可以线性处理组合数,O(1)查询

如今的问题是如何解决神仙数

首先需要搞清楚神仙数的一个性质:他非常少

这是可以证明的

一位的时候有4/7两种,两位有4种,反正1e9内大概不到3000个

这可以n^2DP

令dp[i][j]表示到第i位取j个数的方案数

显然dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*num[a[i]]

num[a[i]]表示大小为a[i]的神仙数个数

于是就可以A掉这题了

代码如下:

#include<map>
#include<cmath>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 1000000007
using namespace std; long long fac[],inv[],n,m,ans;
map<long long,int> m1;
vector<long long> a,b;
long long dp[][]; long long kasumi(long long a,long long b)
{
long long ans=;
while(b)
{
if(b&)
{
ans=ans*a%mod;
}
a=a*a%mod;
b>>=;
}
return ans;
} long long c(int n,int m)
{
if(n>m) return 0ll;
return fac[m]*inv[n]%mod*inv[m-n]%mod;
} int check(long long x)
{
while(x)
{
if(x%!=&&x%!=) return ;
x/=;
}
return ;
} int main()
{
fac[]=;
inv[]=;
for(int i=; i<=; i++)
{
fac[i]=fac[i-]*i%mod;
}
inv[]=kasumi(fac[],mod-);
for(int i=; i>=; i--)
{
inv[i]=inv[i+]*(i+)%mod;
}
scanf("%lld%lld",&n,&m);
long long tmp;
for(int i=; i<=n; i++)
{
scanf("%lld",&tmp);
if(check(tmp))
{
if(m1.count(tmp))
{
m1[tmp]++;
}
else
{
m1[tmp]++;
a.push_back(tmp);
}
}
else
{
b.push_back(tmp);
}
}
for(int i=;i<=;i++)
{
dp[i][]=;
}
if(a.size()>=)
{
dp[][]=m1[a[]];
for(int i=; i<a.size(); i++)
{
for(int j=; j<=a.size(); j++)
{
dp[i][j]=dp[i-][j]+dp[i-][j-]*m1[a[i]];
dp[i][j]%=mod;
}
}
}
int lena=a.size(),lenb=b.size();
ans+=c(m,lenb);
for(int i=; i<=min(lena*1ll,m); i++)
{
ans+=dp[lena-][i]*c(m-i,lenb);
ans%=mod;
}
printf("%lld\n",ans);
}

CodeForces 146E Lucky Subsequence(组合数+DP)的更多相关文章

  1. CodeForces 146E - Lucky Subsequence DP+扩展欧几里德求逆元

    题意: 一个数只含有4,7就是lucky数...现在有一串长度为n的数...问这列数有多少个长度为k子串..这些子串不含两个相同的lucky数... 子串的定义..是从这列数中选出的数..只要序号不同 ...

  2. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  3. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  4. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  5. 【bzoj4517】[Sdoi2016]排列计数 组合数+dp

    题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条 ...

  6. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  7. [Codeforces 280D]k-Maximum Subsequence Sum(线段树)

    [Codeforces 280D]k-Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不 ...

  8. D. Yet Another Problem On a Subsequence 解析(DP)

    Codeforce 1000 D. Yet Another Problem On a Subsequence 解析(DP) 今天我們來看看CF1000D 題目連結 題目 略,請直接看原題 前言 這題提 ...

  9. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    The sequence of integers a1,a2,…,aka1,a2,…,ak is called a good array if a1=k−1a1=k−1 and a1>0a1&g ...

随机推荐

  1. Array 数组类

    除了 Object 之外, Array 类型恐怕是 ECMAScript 中最常用的类型了.而且,ECMAScript 中的数组与其他多数语言中的数组有着相当大的区别.虽然 ECMAScript 数组 ...

  2. 说说JDK中的List-ArrayList、Vector、LinkedList

    为方便开发人员,JDK提供了一套主要数据结构的实现,比如List.Map等.今儿说说List接口. List接口的一些列实现中,最常用最重要的就是这三个:ArrayList.Vector.Linked ...

  3. C# 项目开发笔记

    这里主要记录一些容易错的内容,在项目开发中总结出来的经验和教训. 1 语法 (1)判断float是否为Nan,不能使用 xxx = flaot.Nan去做,要使用float.IsNan去做. (2)u ...

  4. 转 Jquery实际应用,判断radio,selelct,checkbox是否选中及选中的值

    jquery取radio单选按钮的值   $("input[name='items']:checked").val();  另:判断radio是否选中并取得选中的值  如下所示: ...

  5. python:数组/列表(remove()函数、append()函数、sort()函数、reverse()函数)

    排序: 1:整理顺序 #冒泡 lista = [5,7,11,19,99,63,3,9,1] list = [] while lista != []: number = 0 for i in list ...

  6. jquery排序与动态添加option以及属性

    function getOrgansid() { url="<%=basePath%>/rest/bsc/organ/selectOrganSidAllList"; $ ...

  7. 关于IP4上WIFI设置静态IP的一点经验

    一开始我设置IP4的WIFI的"静态"IP地址后,又查看了一下"BootP"或者"DHCP"选项,然后保存退出(关键错误,后有说明),再进W ...

  8. 取消Eclipse的js校验功能

    1 window>>preferences>>javascript>>validator>>Error/warnings 去掉 Enable Javas ...

  9. 【原】Coursera—Andrew Ng机器学习—Week 10 习题—大规模机器学习

    [1]大规模数据 [2]随机梯度下降 [3]小批量梯度下降 [4]随机梯度下降的收敛 Answer:BD A 错误.学习率太小,算法容易很慢 B 正确.学习率小,效果更好 C 错误.应该是确定阈值吧 ...

  10. 读书笔记 Week6 2018-4-12

    Chap 24 重构 读书笔记 一.需求的变更 单纯就科目学习中的小项目来说,目标在一开始便被明确下来,即可定义一份严谨的列表来描述功能.故在原来的编程经历中,只要上交了程序便一切都没事儿了,也没有重 ...