30pts求助
查看原帖
30pts求助
327139
纯白楼主2021/7/18 19:11
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=3e6;
int prime[maxn],vprime[maxn],cprime[maxn];
int k,nex[maxn];
int x;
bool isprime[maxn];
int cnt;
int n,m1,m2;
int ans=0x7f7f7f7f;
void pr()
{
	for (int i=2;i<=maxn-5;i++)
	{
		if (!isprime[i])
		{	
			isprime[i]=true;
			prime[cnt++]=i;
		}
		for (int j=0; j<cnt && prime[j]*i<=maxn-5; j++)
		{
			isprime[prime[j]*i]=true;
			if (!i%prime[j])
				break;
		}
	}
}
bool g(int t, int val, int op)
{
	if(op)
	{
		for (int i=0;i<cnt&&t!=1;i++)
		{
			while (!(t%prime[i]))
			{
				vprime[i]+=val;
				t/=prime[i];
			}
		}
	}
	else 
	{
		k=0;
		for(int i=0;i<cnt&&t!=1;i++)
		{
			bool vis=true;
			while (!(t%prime[i]))
			{
				if (vis)
				{
					vis=false;
					nex[k++]=i;
				}
				cprime[i]+=val;
				t/=prime[i];
			} 
			if (vprime[i] && !cprime[i])
				return false;
		}
	}
	return true;
}
int main ()
{
	scanf("%d",&n);
	scanf("%d%d",&m1,&m2);
	pr();
	g(m1,m2,1);
	for (int i=1;i<=n;i++)
	{
		cin >> x;
		bool f=g(x,1,0);
		if (!f) continue;
		int ma=0;
		for (int j=0;j<k;j++)
		{
			int c=nex[j];
			int nu=cprime[c];
			cprime[c]=0;
			nex[j]=0;
			if (vprime[c]==0) continue;
			int z=(vprime[c] % nu);
			if (!z)
				ma=max(ma,vprime[c] / nu);
			else 
				ma=max(ma,vprime[c] / nu +1);
		}
		ans=min(ans,ma);
	}
	if (ans==0x7f7f7f7f)
		printf("-1");
	else 
		printf("%d",ans);
	return 0;
}

1,7,8过了 卡的第二个点有1w组数据,锣鼓给的错误信息为输出0,其他的错误信息也是输出的0\ 到底是哪里错了啊

2021/7/18 19:11
加载中...