列表

详情


NC23924. 小K的雕塑

描述

小K有n个雕塑,每个雕塑上有一个整数
若集合T中的每一个元素在n个雕塑上都能找得到,则称这个集合为一个优秀的集合
小K想知道所有大小<=k优秀的集合的价值和是多少
一个优秀的集合的价值可以用来表示
特别的F(∅)=1, |∅|=0
即求

输入描述

两个整数n,k,分别表示雕塑的数量与集合大小的上限 
接下来n个整数表示第i个雕塑上的数字a_i是多少

输出描述

一行表示所有大小<=k优秀集合的权值和

示例1

输入:

3 0
1 2 3

输出:

1

示例2

输入:

3 1
1 2 3

输出:

7

示例3

输入:

3 2
1 2 3

输出:

18

示例4

输入:

3 3
1 2 3

输出:

24

示例5

输入:

8 1
1 6 35 45 65 3 56 8

输出:

220

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 24ms, 内存消耗: 508K, 提交时间: 2019-04-27 22:18:18

#include<cstdio>
const int mod=1e9+7;
const int N=5050;
int n,K,x,cnt,ans;
int f[N],vis[N],b[N];
int main(){
    scanf("%d%d",&n,&K);
    for(int i=1;i<=n;i++)
	{
        scanf("%d",&x);
        if(!vis[x])vis[x]=1,b[++cnt]=x;
    }
    f[0]=1;
    for(int i=1;i<=cnt;i++)
     for(int j=i-1;j>=0;j--)
      f[j+1]=(f[j+1]+1ll*f[j]*b[i]%mod)%mod;
    if(K>cnt) K=cnt;
    for(int i=0;i<=K;i++)ans=(ans+f[i])%mod;
    printf("%d\n",ans);
    return 0; 
}

C++11(clang++ 3.9) 解法, 执行用时: 26ms, 内存消耗: 484K, 提交时间: 2019-04-27 18:46:58

#include<cstdio>
const int mod=1e9+7;
const int N=5050;
int n,K,x,cnt,ans;
int f[N],vis[N],b[N];
int main(){
	scanf("%d%d",&n,&K);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		if(!vis[x])vis[x]=1,b[++cnt]=x;
	}
	f[0]=1;
	for(int i=1;i<=cnt;i++)
	for(int j=i-1;j>=0;j--)
	f[j+1]=(f[j+1]+1ll*f[j]*b[i]%mod)%mod;
	if(K>cnt)K=cnt;
	for(int i=0;i<=K;i++)ans=(ans+f[i])%mod;
	printf("%d\n",ans);
}

上一题