乱搞53分求调
  • 板块灌水区
  • 楼主StrFaith
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/11 19:56
  • 上次更新2023/11/11 21:24:30
查看原帖
乱搞53分求调
970752
StrFaith楼主2023/11/11 19:56

P9836

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int n, w;
long long ans = 1;
const long long m =998244353;
int ma[maxn];
struct tree{
    int h, d;
}p[maxn];
bool cmp(tree a, tree b) {
    return a.d < b.d;
}
int sol1(int a) {
    int ans = 0;
    for(int i = 1;i<= a;i++) {
        if(a % i == 0) ans++;
    }
    return ans;
}
int main() {
    scanf("%d%d", &n, &w);
    for(int i =1; i<= n; i++){
        scanf("%d", &p[i].h);
        if(ma[p[i].h] != 0) p[i].d = ma[p[i].h];
        else {
            p[i].d = sol1(p[i].h);
            ma[p[i].h] = p[i].d;
        }
    }
    struct tree bit[w];
    int cnt = 0;
    for(int i = 1; i<=w;i++){
        if(w % i == 0) {
            ++cnt;
            bit[cnt].h = i;
            if(ma[bit[cnt].h] != 0) bit[cnt].d = ma[bit[cnt].h];
            else
            bit[cnt].d = sol1(i);
        }
    }
    sort(p+1, p+n +1, cmp);
    sort(bit + 1, bit+ cnt+1, cmp);
    //for(int i = 1; i<= n;i++)
    //   cout << p[i].d << endl;
    //for(int i = cnt; i >=1;i--)
    //    cout << bit[i].h << endl;
    int j = 1;
    for(int i = cnt; i>=1;i--) {
        if(w == 1)break;
        if(bit[i].h > w) continue;
        p[j].d *= bit[i].d % m;
        w /= bit[i].h;
        if(p[j].d > p[j+1].d) j++;
    }
    for(int i = 1; i<=n; i++)
        ans = ans * (p[i].d) % m;
    cout << ans << endl;
    return 0;
}
2023/11/11 19:56
加载中...