UOJ#22. 【UR #1】外星人

传送门

分析

我们发现一个很神的性质,就是对于一个数如果放在它之前的数小于它那它一定对答案没有贡献

于是我们用dp[i][j]表示从大往小考虑了前i个数,当前答案是j的方案数

我们知道它由两种情况转移来,一种是把这个数放上,另一种是在后面的位置选任意一个给它

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m,a[100100],dp[1050][5050],M;
inline bool cmp(int x,int y){
    return x>y;
}
signed main(){
    int i,j,k;
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=n;i++)scanf("%lld",&a[i]);
    sort(a+1,a+n+1,cmp);
    dp[0][m]=1;
    for(i=1;i<=n;i++){
      for(j=0;j<=m;j++)dp[i][j]=dp[i-1][j]*(n-i)%mod;
      for(j=0;j<=m;j++)dp[i][j%a[i]]=(dp[i][j%a[i]]+dp[i-1][j])%mod;
    }
    for(i=m;i>=0;i--){
      if(dp[n][i]){
          cout<<i<<endl<<dp[n][i];
          return 0;
      }
    }
    return 0;
}
posted @ 2019-02-22 16:07  水题收割者  阅读(247)  评论(0编辑  收藏  举报