HELP 90分 仅仅绿题QAQ
查看原帖
HELP 90分 仅仅绿题QAQ
282080
NewJeanss楼主2020/9/29 22:20
#include <bits/stdc++.h>
#define N 50005
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
int s[N],n,m1,m2,ans,a[N],b[N],f[N],tmp,c[N],Max;
inline int gcd(int a,int b){
	return !b?a:gcd(b,a%b);
}
inline void init(){
	memset(f,0,sizeof(f)); 
	for(int i=2;i<=sqrt(N);i++){
		if(f[i]==1) continue;
		for(int j=i+i;j<=N;j+=i) f[j]=1;	
	}	
	tmp=0;
	for(int i=2;i<=N;i++)
		if(!f[i]) c[++tmp]=i; 
	Max=tmp;
}
inline void divide(int x,int op){
	tmp=1;
	if(op==1) memset(a,0,sizeof(a));
	else memset(b,0,sizeof(b));
	while(x>1&&tmp<=Max){
		while(x%c[tmp]==0){
			x/=c[tmp];
			if(op==1) a[tmp]++;
			else b[tmp]++;
		}
		tmp++;
	}
}
signed main(){
	ios::sync_with_stdio(false); cin.tie(0);
	init();
	while(cin>>n>>m1>>m2){
		for(int i=1;i<=n;i++) cin>>s[i];
		ans=inf;
		for(int i=1;i<=n;i++){
			if(gcd(m1,s[i])==1) continue;
			divide(s[i],1); divide(m1,2); tmp=-1;
			for(int j=1;j<=Max;j++) b[j]*=m2;
			for(int j=1;j<=Max;j++){
				if(a[j]>=b[j]) continue;
				if(a[j]==0){
					tmp=-1; break;
				}
				if(b[j]%a[j]==0) tmp=max(tmp,b[j]/a[j]);
				else tmp=max(tmp,b[j]/a[j]+1);
			}
			ans=tmp==-1?ans:min(ans,tmp);
		}
		else if(ans==inf) cout<<-1<<endl;
		else cout<<ans<<endl;
	}
	return 0;
}

第一个点错了。

思路是质因数分解。

2020/9/29 22:20
加载中...