悬关 50pts求调 样例都过了
查看原帖
悬关 50pts求调 样例都过了
974277
水星湖psgqwq楼主2023/10/2 12:20
#include<bits/stdc++.h>
using namespace std;

int s[10005],m1,m2,n;
int p[30005];//存si的每个质因数个数
int m[30005];//存m1^m2的每个质因数的个数
int main(){
	cin>>n>>m1>>m2;
	for(int i=1;i<=n;i++)
		cin>>s[i];
		
	//分解m1^m2的质因数
	for(int i=2;i*i<=m1;i++)
	{
		int cnt = 0;
		while(m1%i==0)
		{
			m1/=i;
			cnt++;
		}
		m[i] = cnt*m2;
	}
	if(m1!=1)m[m1] = m2;

	
	int ans = 2e9;
	for(int i=1;i<=n;i++)//每一个si
	{
		int maxn = 0,flag = 1;
		memset(p,0,sizeof(p));
		//对其分解质因数
		for(int j=2;j*j<=s[i];j++)
		{
			int cnt = 0;
			while(s[i]%j==0)
			{
				s[i]/=j;
				cnt++;
			}
			p[j] = cnt;
		}
		if(s[i]!=1&&s[i]<=30000)//最后自己还是个质因数且小于三万a
			p[s[i]]++;
		for(int j=2;j<=30000;j++)
		{
			if(p[j]==0&&m[j])//m有的质因数si没有
			{
				flag = 0;
				break;//剪枝
			}
			else
				maxn = max(maxn,int(ceil(1.0*m[j]/p[j])));
		}
		if(flag == 1)
			ans = min(ans,maxn);
	}
	if(ans!=2e9)
		cout<<ans;
	else 
		cout<<-1;
	return 0;
}
2023/10/2 12:20
加载中...