细胞分裂(质因数分解)
题目链接: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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下