NC23924. 小K的雕塑
描述
输入描述
两个整数n,k,分别表示雕塑的数量与集合大小的上限
接下来n个整数表示第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); }