洛谷1069 细胞分裂
原题链接
其实就是分解质因数。
将m1分解质因数,注意每个质因数的个数要乘上m2,设个数为aj。
而要使得mm21|Ski,显然要求Si的质因数包含m1的质因数,至于个数的要求,让k足够大即可。
因此对每一个Si用m1的质因数去试除,若全部能除尽,那这个细胞肯定是可行的。然后计算出对于每个质因数在Si中拥有的个数bj,那么对于这个细胞达到要求的所需时间为max。
最后的答案就是对每个可达到要求的细胞所需时间取\min。
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 110;
int pr[N], S[N], l;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline int maxn(int x, int y) { return x > y ? x : y; }
inline int minn(int x, int y) { return x < y ? x : y; }
int main()
{
int i, j, x, s, k, n, m_1, m_2, an = 1e9;
n = re(); m_1 = re(); m_2 = re();
for (i = 2; i * i <= m_1; i++)
if (!(m_1 % i))
{
for (pr[++l] = i; !(m_1 % i); S[l]++, m_1 /= i);
S[l] *= m_2;
}
if (m_1 > 1)
{
pr[++l] = m_1;
S[l] = m_2;
}
for (i = 1; i <= n; i++)
{
x = re();
for (j = 1; j <= l; j++)
if (x % pr[j])
break;
if (j <= l)
continue;
for (j = 1, k = 0; j <= l; j++)
{
for (s = 0; !(x % pr[j]) && s <= S[j]; s++, x /= pr[j]);
k = maxn(k, ceil(S[j] * 1.0 / s));
}
an = minn(an, k);
}
printf("%d", an == 1e9 ? -1 : an);
return 0;
}
posted on 2019-02-16 13:53 Iowa_Battleship 阅读(167) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix