传送门
随便搞了个DP过了emm...
g[x][y]表示到第x个数当前数被膜到y
从小到大排个序然后倒着做
因为小的先膜了大的就没用了
所以当前这个位置两种转移 选择这个数膜掉 或者 提前选一个小点的数当前这个数就没用了直接转移就行了
附代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define mdn 998244353
#define ll long long
#define mod(x) x>=mdn?x-=mdn:NULL
using namespace std;
int n,a[1010],x,g[1010][5010];
int main()
{
int i,j;
scanf("%d%d",&n,&x);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
g[n+1][x]=1;
for(i=n;i;i--)
for(j=0;j<=x;j++)
{
int tmp=j%a[i];g[i][tmp]+=g[i+1][j];mod(g[i][tmp]);
g[i][j]+=(ll)g[i+1][j]*(i-1)%mdn,mod(g[i][j]);
}
for(i=a[1];i;i--) if(g[1][i]) break;
printf("%d
%d
",i,g[1][i]);
return 0;
}