97 pts 求调
  • 板块P9836 种树
  • 楼主NPCaaabc
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/11 19:00
  • 上次更新2023/11/11 20:40:21
查看原帖
97 pts 求调
804794
NPCaaabc楼主2023/11/11 19:00

WA on 14

#include<bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
int n,w;
int LW[1300];
int TW[1300];
int top = 1;int l = 1;

int valF[11451];
int valSP[11451]; // SizePrime
int vis[11451];

int p[11451];set<int> s[11451];
int f[11451];
void DW(){
    for(int i=2;i<=w;i++){
        if(w % i == 0) {
            LW[top] = i;
            while(w % i == 0) w /= i,TW[top] ++;
            top++;
        }
    }
} // Deal with W .
void init(){
    for(int i=1;i<=10000;i++) {
        for(int j=1;i*j <= 10000;j++) {
            valF[j*i] ++;
        }
    }
    for(int i=2;i<=10000;i++){
        if(vis[i]) continue;
        for(int j=1;i*j<=10000;j++){
            valSP[i*j]++;
            vis[i*j] = 1; 
        }
    }
}
bool ZC(int base,int L){
    if(p[L]%base == 0) return true;
    if(s[L].find(base) != s[L].end()) return true;
    return false;
}
int GS(int L) {return valSP[p[L]] + s[L].size();}
int main(){
    scanf("%d%d",&n,&w);
    DW();
    init();
    for(int i=1;i<=n;i++){
        scanf("%d",&p[i]);
        f[i] = valF[p[i]];
    }
    while(l != top){
        int tmpA = 0,tmpP = 0;
        bool op = 1;
        int k = LW[l];
        for(int i=1;i<=n;i++){
            int nxtA = 0;
            if(ZC(k,i)) {
                nxtA = f[i] / 2;
            }
            else nxtA = f[i],op = 0;
            if(tmpP == 0 || (double)nxtA / f[i] > (double) tmpA / f[tmpP]) {
                tmpA = nxtA;
                tmpP = i;
            }
        }
        if(!op) s[tmpP].insert(k); 
        f[tmpP] += tmpA;
        TW[l] --;
        if(TW[l] == 0) l++;
    }
    long long res = 1;
    for(int i=1;i<=n;i++) res *= f[i],res %= 998244353;
    printf("%lld",res);
    return 0;
}
2023/11/11 19:00
加载中...