题目传送门

发现这题真的坑超多啊...调了一晚上终于过了...我好菜啊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. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  2. openwrt 配置rsync服务

    一: rsyn简介 remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息. rsync是用 “rsyn ...

  3. 查询历史使用过的命令并使用(history)

    一.什么是history 在bash功能中.它能记忆使用过的命令,这个功能最大的优点就是能够查询以前做过的举动.从而能够知道你的执行步骤.那么就能够追踪你曾下达过的命令.以作为除错的工具. 二.His ...

  4. Spark 学习笔记:(二)编程指引(Scala版)

    参考: http://spark.apache.org/docs/latest/programming-guide.html 后面懒得翻译了,英文记的,以后复习时再翻. 摘要:每个Spark appl ...

  5. Swift开发教程--怎样播放图片动画

    废话少说,直接上代码: var barsAnim = UIImageView(frame: self.view.frame); barsAnim.animationImages = NSArray() ...

  6. collection 模块 双端队列

    单端队列 用于同一进程中的队列,可以叫做单进程队列. queue 遵循先进先出,先进去的必须先出来 1.先进先出: impore queue q = queue.Queue() 实例化一个对象 q.p ...

  7. Codeforces Round #422 (Div. 2) A. I'm bored with life 暴力

    A. I'm bored with life     Holidays have finished. Thanks to the help of the hacker Leha, Noora mana ...

  8. Mac OS用docker Desktop安装单节点kubernetes

    方案: 安装方式:阿里云minikube,k8s官方minikube,kubeadm, docker Desktop中自带第k8s 安装环境:在linux虚拟机中安装k8s,在macos中安装k8s, ...

  9. ArchLinux最小化安装 必备库 常用命令

    铸成强大的工作站环境——ArchLinux最小化安装 所有问题归结起来,只是一个问题:ArchLinux最小化安装,需要安装哪些包? 1.bash//最基本的Bash Shell(必须)2.bzip2 ...

  10. NIO原理图