随便搞了个DP过了emm...
g[x][y]表示到第x个数当前数被膜到y
从小到大排个序然后倒着做
因为小的先膜了大的就没用了
所以当前这个位置两种转移 选择这个数膜掉 或者 提前选一个小点的数当前这个数就没用了直接转移就行了
附代码。
#include#include #include #include #define inf 20021225#define mdn 998244353#define ll long long#define mod(x) x>=mdn?x-=mdn:NULLusing 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\n%d\n",i,g[1][i]); return 0;}