我这么做为什么不对?
  • 板块P9836 种树
  • 楼主ShaunJulian
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/17 22:49
  • 上次更新2023/11/18 16:59:06
查看原帖
我这么做为什么不对?
998474
ShaunJulian楼主2023/11/17 22:49

我将每个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;
}
2023/11/17 22:49
加载中...