题意:
给你n个题目,让你从中选取k个题目来生成一场比赛,每个题目有一个难度等级,一场比赛中题目的难度等级不能重复,让你求方案数。
思路:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
int a[1010];
ll dp[1010][1010];
map<int,int>vis;
int main(){
int n,k;cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
vis[a[i]]++;
}
sort(a+1,a+n+1);
n=unique(a+1,a+n+1)-a-1;
// cout<<n<<endl;
// dp[0][0]=1;
for(int i=1;i<=n;i++){
dp[i][1]=dp[i-1][1]+vis[a[i]];
dp[i][1]%=mod;
}
// dp[0][0]=1;
for(int i=2;i<=n;i++){
for(int j=2;j<=min(k,i);j++){
// cout<<i<<" "<<j<<endl;
dp[i][j]=(dp[i-1][j-1]*vis[a[i]])%mod;
dp[i][j]%=mod;
if(i-1>=j)dp[i][j]+=dp[i-1][j];
dp[i][j]%=mod;
// cout<<dp[i][j]<<endl;
}
}
// int sum=0;
// for(int i=k;i<=n;i++){
// sum+=dp[i][k];
// sum%=mod;
// }
cout<<dp[n][k]<<endl;
}