50分求助,示例2没法调
查看原帖
50分求助,示例2没法调
1005745
hanxin233楼主2023/6/18 20:26

示例2过不了,只能拿50分

#include<iostream>
using namespace std;
using ll= long long;
int N,S,m1,m2,midres=-1,result=INT32_MAX,cnt=0,mpower,spower,mtemp;
//midres用来求每个S的最后结果,result求midres的最小结果,mpower,spower用来存储m和s的每个质因数的幂
//mtemp:每次输入S后,mtemp就等于m1用来自除 
int prime[6001],win[50001];
int workm(int p);		//返回数字mtemp的质数p的幂,并对mtemp除去质因数p 
int works(int p); //同理处理S 
int main(){
	cin>>N>>m1>>m2;
	//补个特殊情况 
	if(m1==1){cout<<0;return 0;}
	prime[0]=prime[1]=1;
  	//遍历50000以内的素数
	for(int i=2;i*i<=50000;i++)
		if(!prime[i]){
			prime[++cnt]=i;
			for(int j=i<<1;j<=50000;j+=i)
				prime[j]=1;}
	while(N--){
		midres=-1;
		mtemp=m1;
		//补个特殊情况 
		cin>>S;if(S==1)	continue;
		for(int i=1;i<=cnt;i++){
			mpower=workm(prime[i]);
			spower=works(prime[i]);
			//特殊情况处理,m有s没有的质数 
			if(mpower!=0&&spower==0){midres=-1;break;}
			//s的质因数幂为0就直接跳过 
			if(spower==0)	continue;
			midres=max(midres,(mpower*m2-1)/spower+1);
			//mtemp等于1的时候就不用处理了
			if(mtemp==1)	break;
		}
		//特殊情况处理,最后mtemp是个质数,并且这个质数无法被S消去,那就是t=-1 
		if(mtemp!=1&&S%mtemp!=0)	midres=-1;
                                //擂台求最小result,注意对-1的处理
		if(midres==-1&&result!=INT32_MAX)	continue;	
		if(midres<result)	result=midres;
	}
	cout<<result;
	return 0;
} 
int workm(int p){
	int cnt1=0;
	for(;mtemp%p==0;mtemp/=p)
		cnt1++;
	return cnt1;
}
int works(int p){
	int cnt1=0;
	for(;S%p==0;S/=p)
		cnt1++;
	return cnt1;
}
2023/6/18 20:26
加载中...