我将每个a[i]的各个质因子个数+1存在c数组,w可以拆出来的各个质因子个数存在d数组,然后贪心,结果大数据不行 难道是我复杂度不对?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const ll MAXN=1e4+2;
ll N,W;
ll Mn=1;
ll mN=1;
ll D[MAXN];
ll C[MAXN][MAXN];
int ck(ll x)
{
for(ll i=2;i<=sqrt(x);i++)
if(x%i==0)
return 0;
return 1;
}
void P(ll x)
{
if(ck(x))
{
mN=max(mN,x);
D[x]++;
return;
}
for(ll i=2;i<=sqrt(x);i++)
if(x%i==0)
{
mN=max(mN,i);
D[i]++;
x/=i;
P(x);
break;
}
}
void p(ll x,ll op)
{
if(ck(x))
{
Mn=max(Mn,x);
C[x][op]++;
return;
}
for(ll i=2;i<=sqrt(x);i++)
if(x%i==0)
{
Mn=max(Mn,i);
C[i][op]++;
x/=i;
p(x,op);
break;
}
}
void add(ll x,ll sum)
{
if(sum==0)return;
ll pre=LONG_LONG_MAX;
for(ll i=1;i<=N;i++)
pre=min(pre,C[x][i]);
for(ll i=1;i<=N;i++)
if(C[x][i]==pre)
{
C[x][i]++;
sum--;
if(sum==0)
break;
}
add(x,sum);
}
int main()
{
scanf("%lld%lld",&N,&W);
P(W);
ll tp;
for(ll i=1;i<=N;i++)
{
scanf("%lld",&tp);
p(tp,i);
}
for(ll i=1;i<=Mn;i++)
for(ll j=1;j<=N;j++)
C[i][j]++;
for(ll i=1;i<=mN;i++)
if(ck(i))
add(i,D[i]);
ll ans=1;
for(ll i=1;i<=max(Mn,mN);i++)
for(ll j=1;j<=N;j++)
ans=ans*C[i][j]%mod;
printf("%lld",ans);
return 0;
}