Luogu P1069细胞分裂【分解质因数/数论】By cellur925
发现这题真的坑超多啊...调了一晚上终于过了...我好菜啊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的更多相关文章
- luogu P1069 细胞分裂
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- P1069 细胞分裂
P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...
- P1069 细胞分裂——数学题,质因数分解
P1069 细胞分裂 我们求的就是(x^k)|(m1^m2) k的最小值: 先给m1分解质因数,再给每个细胞分解: 如果m1有的质因数,细胞没有就跳过: 否则就记录答案: 注意整数除法下取整的原则: ...
- 洛谷 P1069 细胞分裂 解题报告
P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...
- 洛谷—— P1069 细胞分裂
https://www.luogu.org/problem/show?pid=1069#sub 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细 ...
- 【洛谷P1069 细胞分裂】
题目链接 首先,光看题就觉得它很扯淡(你哪里来这么多的钱来买试管) 根据某位已经ak过ioi的名为ych的神仙说(一看就是数学题,一看就需要因式分解,emm,我果然没有发现美的眼睛qwq) 那么我们就 ...
- 细胞分裂(洛谷 P1069)
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- [CodeForces - 1225D]Power Products 【数论】 【分解质因数】
[CodeForces - 1225D]Power Products [数论] [分解质因数] 标签:题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory ...
- Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】
Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...
随机推荐
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- openwrt 配置rsync服务
一: rsyn简介 remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息. rsync是用 “rsyn ...
- 查询历史使用过的命令并使用(history)
一.什么是history 在bash功能中.它能记忆使用过的命令,这个功能最大的优点就是能够查询以前做过的举动.从而能够知道你的执行步骤.那么就能够追踪你曾下达过的命令.以作为除错的工具. 二.His ...
- Spark 学习笔记:(二)编程指引(Scala版)
参考: http://spark.apache.org/docs/latest/programming-guide.html 后面懒得翻译了,英文记的,以后复习时再翻. 摘要:每个Spark appl ...
- Swift开发教程--怎样播放图片动画
废话少说,直接上代码: var barsAnim = UIImageView(frame: self.view.frame); barsAnim.animationImages = NSArray() ...
- collection 模块 双端队列
单端队列 用于同一进程中的队列,可以叫做单进程队列. queue 遵循先进先出,先进去的必须先出来 1.先进先出: impore queue q = queue.Queue() 实例化一个对象 q.p ...
- 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 ...
- Mac OS用docker Desktop安装单节点kubernetes
方案: 安装方式:阿里云minikube,k8s官方minikube,kubeadm, docker Desktop中自带第k8s 安装环境:在linux虚拟机中安装k8s,在macos中安装k8s, ...
- ArchLinux最小化安装 必备库 常用命令
铸成强大的工作站环境——ArchLinux最小化安装 所有问题归结起来,只是一个问题:ArchLinux最小化安装,需要安装哪些包? 1.bash//最基本的Bash Shell(必须)2.bzip2 ...
- NIO原理图