细胞分裂(质因数分解)

题目链接:https://www.luogu.com.cn/problem/P1069

题意:

共有m1^m2支试管,一开始有n种单个细胞,第i个细胞每秒能分裂出si个完全相同的细胞(细胞个数的变化:1->si->si*si->si*si*si->...,很重要)
现在求能让任意一种细胞能够被试管均分的最短时间
即S%(m1^m2)=0

思路:

既然S%(m1^m2)=0,那么将S和m1进行质因数分解,若S和m1有相同的质因子种类,那么就是求任意一个 S质因子次数 到达 m1质因子次数 的所花费时间的最大值。
时间复杂度O(nlogm1)

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define endl "\n"
#define int long long
#define fi first
#define se second
//#pragma GCC optimize(3)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const ll llmax=LLONG_MAX;
const int maxn=3e4+5;
const int mod=1e9+7;

int n,m1,m2;
ll a[maxn];
int prim_m[maxn];

signed main()
{
	ios::sync_with_stdio(false),cin.tie(0);
	cin>>n>>m1>>m2;
	int tem=m1;
	for(int j=2;j*j<=m1;j++){
			while(tem%j==0){
				prim_m[j]++;
				tem/=j;
			}
		}
	if(tem>1)prim_m[tem]++;
	vector<pii>prime;
	rep(i,1,m1){
		if(prim_m[i]){
			prime.pb(pii{i,prim_m[i]*m2});
		}
	}
	
	ll ans=llmax;
	rep(i,1,n) {
		cin>>a[i];
		int temp=a[i];
		bool ok=true;
		vector<int>ge(m1,0);
		int cnt=0;
		for(int j=0;j<prime.size();j++){
			if(a[i]%prime[j].fi!=0){
				ok=false;
				break;
			}
			while(a[i]%prime[j].fi==0){
				ge[cnt]++;
				a[i]/=prime[j].fi;
			}
			cnt++;
		}	
		
		if(ok){
			ll res=0;
			for(int j=0;j<prime.size();j++){
				int dif=prime[j].se-ge[j];
				if(dif<=0)continue;
				res=max(res,(ll)ceil(1.0*prime[j].se/ge[j]));
			}
//			cout<<"big "<<big<<endl;
//			cout<<"res " <<res<<endl;
			ans=min(ans,res);
//			cout<<"ans "<<ans<<endl;
		}
		
	}
	if(ans==llmax)cout<<-1;else cout<<ans;
	return 0;
}


posted @   Marinaco  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示