50 WA求救
查看原帖
50 WA求救
278259
RemiliaScar1et楼主2020/8/25 16:17

QAQ

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=300010;
const int B=2000000000;
int n,m1,m2;
ll prime[N],tot=0;
bool mp[N];
int s[N];
int mi[N],si[N];

void init(int n)
{
	for(register int i=2;i<=n;i++)
	{
//		cout<<"???";
		if(!mp[i]) prime[++tot]=i;
		for(register int j=1;prime[j]*i<=n&&j<=tot;j++)
		{
			mp[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}
}

int main()
{
	freopen("P1069_2.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	init(30000);
//	for(int i=1;i<=30000;i++)
//		cout<<prime[i]<<endl;
	cin>>n>>m1>>m2;
	if(m1==1) 
	{
		cout<<0;
		return 0;
	}
	for(int i=1;i<=tot;i++)
	{
		if(m1==1) break;
		while(m1%prime[i]==0)
		{
			mi[i]++;
			m1/=prime[i];
		}
		mi[i]*=m2;
	}
	ll minn=1145141919810;
	for(int i=1;i<=n;i++)
	{
		int k;
		cin>>k;
		if((k>m1&&k%m1!=0)||(k<m1&&m1%k!=0)) continue;
		memset(si,0,sizeof si);
		int fin=-1,sflag=1;
		for(int i=1;i<=tot;i++)
		{
			fin=i;
			int psd=k;
			if(k==1) break;
			while(k%prime[i]==0)
			{
				si[i]++;
				k/=prime[i];
				if(k==1) break;
			}
//			if(si[i]>2)	cout<<psd<<' '<<prime[i]<<' '<<si[i]<<endl;
			if((si[i]&&!mi[i])||(!si[i]&&mi[i]))
			{
				sflag=0;break;
			}
		}
		if(sflag==0) continue;
		ll maxn=-10;
		for(int i=1;i<=fin;i++)
		{
			ll ans;
			if(mi[i]==0||si[i]==0||mi[i]<si[i]) continue;
			ans=( mi[i]%si[i]==0 ? mi[i]/si[i] : mi[i]/si[i]+1 );//向上取整除法
			maxn=max(maxn,ans);
//			if(si[i]>2)
//			cout<<prime[i]<<' '<<mi[i]<<'/'<<si[i]<<'='<<maxn<<endl;
		}
		if(maxn<0) continue;
		minn=min(minn,maxn);
	}
	if(minn==1145141919810) cout<<-1;
	else cout<<minn;
	return 0;
}
2020/8/25 16:17
加载中...