1. 程式人生 > 實用技巧 >P1069 細胞分裂

P1069 細胞分裂

Aimee

很簡單的一個東西

除了我吧%寫成了/之後

思路:如果如此,那麼\(m1^{m2}\)中的每一個質因數一定比s中在最後一天的時候的指數大

就用這個做

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std; 
int n;
int mz,my;
int s[54000];
int su[54001];
int p;
int vis[54001];
int prime[54001];
int pr[54001];
int num[54001];
int pp;
int x; 
void div(){
	for(int i=2;i<=45000;++i){
		if(!vis[i]){
			prime[++p]=i;
			for(int j=i+i;j<=45000;j+=i){
				vis[j]=1;
			}
		}
	} 
	for(int i=1;i<=p;++i){
		vis[i]=0;
		while(mz%prime[i]==0){
			if(vis[i]==0){
				vis[i]=1;
				pr[++pp]=prime[i];
			}
			num[pp]++;
			mz/=prime[i];
		}
	}
}
int ans;
int Ai;
int res;
bool deal(int now){
	int numm;
	res=-1;
	for(int i=1;i<=pp;++i){
		if(now<pr[i])
		return 0; 
		numm=0;
		if(now%pr[i]==0){
			while(now%pr[i]==0){
				numm++;
				now/=pr[i];
			}
			if(numm>=num[i]){
				res=max((long long)1,res);
			}
			if(num[i]*my%numm==0)
			res=max(res,num[i]*my/numm);
			else
			res=max(res,num[i]*my/numm+1);
		}else{
			return 0;
		}
	}
	return 1;
}
signed main(){
	scanf("%lld",&n);
	scanf("%lld%lld",&mz,&my);
	ans=20000000000000;
	if(mz==1){
		cout<<0<<endl;
		return 0;
	}
	div();
	for(int i=1;i<=n;++i){
		scanf("%lld",&x); 
		if(deal(x)){
			ans=min(ans,res);
		}
	}
	if(ans==20000000000000){
		cout<<-1;
	}else{
		cout<<ans<<endl;
	}
	return 0;
}