题意:
给n个数,求选m个不同的数有多少种方法
思路:
dp[i]:表示选i个不同的数的方法数,每次还要加上前面的数的
所以,dp[i]=(dp[i]+dp[i-1]*mp[vc[i]])%mod;
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
vector<int>vc;
ll dp[1010];
map<int,int>mp;
int main()
{
int n,k;
cin>>n>>k;
int x;
for(int i=1;i<=n;i++){
cin>>x;
if(!mp[x]) vc.push_back(x);
mp[x]++;//记录x的出现次数
}
memset(dp,0,sizeof(dp));
dp[0]=1;//想乘,初始化为1
int len=vc.size();
for(int i=0;i<len;i++){//在前i个数里,依次记录dp[j]的个数,从高往低记录使没有后效性
for(int j=k;j>=1;j--){
dp[j]=(dp[j]+dp[j-1]*mp[vc[i]])%mod;
}
}
cout<<dp[k]<<endl;
return 0;
}