题目传送门

发现这题真的坑超多啊...调了一晚上终于过了...我好菜啊qwq。

题意说的比较明白,让你求满足(si^k)%(m1^m2)==0的最小k值。然后看数据范围我们知道,我们肯定不能暴力的判断,需要应用到算术基本定理的内容。

我的思路:把m1分解质因数,拆成算术基本定理的形式,再把每个质因数的个数乘上m2.

     之后对于每个细胞,我们也将他分解质因数。显然,m1的质因数在si中必须出现,否则消不掉也就不能整除。之后我们找哪个质因数被削掉需要分裂的次数最多,这个次数作为这个细胞的次数。(这里思路有点偏差,算被削掉需要分裂的次数时,是下除上而不是下减上。因为是将si进行乘方。而且还要判断是否能整除,不能整除还要加1)

     至于无解的情况,记录一个step,如果每个细胞都有不存在试管质因子的情况,则step++,最后若step==n判定无解。

思路看起来比较清晰的...不过昨天手残导致了许多错误233

现列举如下:

1.  炸内存。原因是在用细胞质因子与试管质因子逐渐逼近时没有判断边界

2.  由于用到 了许多数组,把数组名自己搞混了==
3.  变量名(循环的ij)搞混了

4.  分解质因数部分板子敲错了,最后应为(m>1),否则遇到平方数就会很不好搞

5.  对特殊情况的考虑:m1=1的时候不需要培养时间,答案为0;si=1时这个细胞不可用。

6.  每次检验完一个细胞恢复初值

Code

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath> using namespace std; int n,cnt,hu;
int m1,m2,ans=0x7fffffff,num,step;
int cell[],pm1[],cm1[],ps[],cs[];
bool vis[]; void init()
{
num=;
memset(vis,,sizeof(vis));
memset(cs,,sizeof(cs));
} int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&n);
scanf("%d%d",&m1,&m2);
if(m1==) {printf("");return ;}
for(int i=;i<=n;i++) scanf("%d",&cell[i]);
for(int i=;i<=sqrt(m1);i++)
if(m1%i==)
{
pm1[++cnt]=i,cm1[cnt]=;
while(m1%i==) m1/=i,cm1[cnt]++;
}
if(m1>) pm1[++cnt]=m1,cm1[cnt]++;
for(int i=;i<=cnt;i++) cm1[i]*=m2;
for(int i=;i<=n;i++)
{
int renew=;
int tmp=cell[i];
if(tmp==) {step++;continue;}
bool flag=;
for(int j=;j<=sqrt(tmp);j++)
if(tmp%j==)
{
vis[j]=;
ps[++num]=j,cs[num]=;
while(tmp%j==) tmp/=j,cs[num]++;
}
if(tmp>)
{
vis[tmp]=;
ps[++num]=tmp;cs[num]++;
}
for(int j=;j<=cnt;j++) if(!vis[pm1[j]]) {step++;flag=;break;}
if(flag) {init();continue;}
int head=;
for(int j=;j<=cnt;j++)
{
while(ps[head]!=pm1[j]&&head<num) head++;
if(cm1[j]%cs[head]==) renew=max(renew,cm1[j]/cs[head]);
else renew=max(renew,cm1[j]/cs[head]+);
}
// printf("%d:%d\n",i,renew);hu++;
ans=min(ans,renew);
init();
}
if(step==n) printf("-1");
else printf("%d",ans);
return ;
}

*  Update  关于复杂度的问题

因为我是把每个细胞分解质因数,所以复杂度可能达到O(n*sqrt(si)),si是2e9级别,n是10000级别。开始我还怀疑了自己的复杂度。

讨论帖

后来经各路dalao指点,发现其实筛出m1的素数那么一搞也行,复杂度就可行了。(可能本题数据太弱所以我也过了?逃)

Luogu P1069细胞分裂【分解质因数/数论】By cellur925的更多相关文章

  1. luogu P1069 细胞分裂

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  2. P1069 细胞分裂

    P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...

  3. P1069 细胞分裂——数学题,质因数分解

    P1069 细胞分裂 我们求的就是(x^k)|(m1^m2) k的最小值: 先给m1分解质因数,再给每个细胞分解: 如果m1有的质因数,细胞没有就跳过: 否则就记录答案: 注意整数除法下取整的原则: ...

  4. 洛谷 P1069 细胞分裂 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  5. 洛谷—— P1069 细胞分裂

    https://www.luogu.org/problem/show?pid=1069#sub 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细 ...

  6. 【洛谷P1069 细胞分裂】

    题目链接 首先,光看题就觉得它很扯淡(你哪里来这么多的钱来买试管) 根据某位已经ak过ioi的名为ych的神仙说(一看就是数学题,一看就需要因式分解,emm,我果然没有发现美的眼睛qwq) 那么我们就 ...

  7. 细胞分裂(洛谷 P1069)

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...

  8. [CodeForces - 1225D]Power Products 【数论】 【分解质因数】

    [CodeForces - 1225D]Power Products [数论] [分解质因数] 标签:题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory ...

  9. Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】

    Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...

随机推荐

  1. 2014牡丹江 现场赛 F zoj 3824 Fiber-optic Network

    首先赞一下题目, 好题 题意: Marjar University has decided to upgrade the infrastructure of school intranet by us ...

  2. 在线API

    JExcelApi http://jexcelapi.sourceforge.net/resources/javadocs/index.html Poi http://poi.apache.org/a ...

  3. XenServer网卡Bonding

    在给XenServer配置网卡bonding时,需要在所有节点都添加到集群之后再进行,这也是来自Citrix的建议:"Citrix recommends never joining a ho ...

  4. mysql下distinct和group by区别对比

    在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group ...

  5. RDLC后台自己定义报表模板

    首先封装一个公共类,统一来操作RDLC报表 using System; using System.Collections.Generic; using System.Linq; using Syste ...

  6. COGS28 [NOI2006] 最大获利[最大权闭合子图]

    [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] 新的技术正冲击着手 ...

  7. Linux epoll 源码注释

    https://www.cnblogs.com/stonehat/p/8613505.html 这篇文章值得好好读,先留个记录,回头看. IO多路复用之epoll总结 - Anker's Blog - ...

  8. 探讨Ajax中有关readyState(状态值)和status(状态码)的问题

    先看下面一段代码,然后给大家详细介绍,Ajax中有关readyState(状态值)和status(状态码)的问题,具体内容如下所示: var getXmlHttpRequest = function ...

  9. 解决 git branch -a 无法全部显示远程的分支,只显示master分支

    新建分支 若遇到 git branch -a 无法全部显示远程的分支,只显示master分支 可以通过 git fetch 将本地远程跟踪分支进行更新,与远程分支保持一致

  10. parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的column使用列存储格式,这样获取某一row数据时候不需要跨机器获取

    Parquet是Twitter贡献给开源社区的一个列数据存储格式,采用和Dremel相同的文件存储算法,支持树形结构存储和基于列的访问.Cloudera Impala也将使用Parquet作为底层的存 ...