2009NOIP普及组真题 3. 细胞分裂

线上OJ:

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1947

核心思想:

本题的意思是 在所有的 S i Si Si 中,找一个 S i t Si^t Sit 最早能被 m 1 m 2 m1^{m2} m1m2 整除
上述若能整除,则说明:
1、 m 1 m1 m1 的质因数肯定是 S i Si Si 质因数的子集 (换句话说,m1 的质因数都是 Si 的因数。如果 m 1 m1 m1 中某个质因数不能整数 S i Si Si,则整个 S i t Si^t Sit 不可能被 m 1 m 2 m1^{m2} m1m2 整除)
2、若 m 1 m1 m1 的质因数本身是多次幂(比如 m 1 m1 m1 为40,则 m 1 = 2 ∗ 2 ∗ 2 ∗ 5 = 2 3 ∗ 5 m1 = 2*2*2*5 = 2^3*5 m1=2225=235,即质因数2的幂次为3,质因数5的幂次为1)。若此时的 m2 是2,则
m 1 m 2 = ( 2 3 ∗ 5 1 ) 2 = ( 2 3 ∗ 2 ) ∗ ( 5 1 ∗ 2 ) = 2 6 ∗ 5 2 m1^{m2} = (2^3*5^1)^2 = (2^{3*2})*(5^{1*2})=2^6*5^2 m1m2=(2351)2=(232)(512)=2652

如果此时 S i Si Si 的质因数中,2有6个,5有2个,则 1 秒后到达 S i Si Si 即可直接整除 m 1 m 2 m1^{m2} m1m2
如果此时 Si 的质因数中,2有3个,5有1个,则2个周期后可整除 m 1 m 2 m1^{m2} m1m2
如果此时 Si 的质因数中,2有2个,5有1个,则3个周期后才能整除 m 1 m 2 m1^{m2} m1m2

故, S i Si Si 的分裂周期为 S i Si Si 的质因数中分裂周期最多的那个

关键步骤:

1、先计算 m 1 m1 m1 的质因数,存储到数组 p [ i ] p[i] p[i] 中;用 c [ i ] c[i] c[i] 记录质因数 p [ i ] p[i] p[i] 的个数。
2、如果是质数,要单独考虑
3、如果m1为1,则无需计算,直接输出
4、在读入每个 S i Si Si 时按以下步骤进行:
a. 检查m1的每一个质因数是否都是 Si 的因数,如果有一个不是,则Si不可能被除尽
b. 检查每一个质因数在 Si 中出现的次数
c. 求出每一个质因数需经过几个周期方能被 m 1 m1 m1 中对应的幂次整除

举例: S i Si Si 为800,m1为40,m2 是2。则 S i = 2 5 ∗ 5 2 , m 1 m 2 = 2 6 ∗ 5 2 Si=2^5*5^2,m1^{m2} =2^6*5^2 Si=2552m1m2=2652。细胞 Si 经过一个周期变为 2 5 ∗ 5 2 2^5*5^2 2552,无法被 2 6 ∗ 5 2 2^6*5^2 2652 整除,经过两个周期变为 2 10 ∗ 5 4 2^{10}*5^4 21054,可以被 2 6 ∗ 5 2 2^6*5^2 2652 整除。所以 Si=800的需要2个周期。

d. 找出 Si 的所有质因数中分裂周期最多的那个
5、所有的 Si 都读完后,找出分裂周期最小的数值,就是本题的答案。

题解代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

const int N = 30005;

int n, m1, m2, s, ans, maxn;
// p[i]记录m1的第i个质因数,c[i]表示m1的第i个质因数的个数。比如12=2*2*3,所以p[1]=2,c[1]=2,p[2]=3,c[2]=1
int p[N], c[N], cnt = 0; // cnt记录m1的质因数的个数。比如 12的质因数是2和3,则cnt=2
bool isprime = true; // m1是否为质数

int main()
{
    scanf("%d %d %d", &n, &m1, &m2);
    if(m1 == 1)  // 如果m1为1,说明就1个试管,直接放即可
    {
        printf("0\n");
        return 0;
    }

    int x = m1;
    
    for(int i = 2; (i*i <= m1) && x; i++) // 求出m1的所有质因数,以及每个质因数的个数
    {
        if( x % i == 0 ) // 如果存在i能整除m1
        {
            isprime = false;  // 如果找到一个质因数,则m1不是质数
            p[++cnt] = i; // 将质因数 i 存到p数组里,p数组从p[1]开始
        }
        while( x % i == 0 )
        {
            c[cnt]++; // 记录m1的质因数 i 的个数
            x /= i;
        }        
    }
    
    if(isprime) // 如果是质数,则上述for循环无法找到质因数。
    {
        p[++cnt] = m1; // 质数的质因数只有自己
        c[cnt] = 1;
    }

    ans = INF;
    while(n--) // 读入n个数,逐次判断
    {
        maxn = -INF; // 每一轮开始前,先初始化。maxn 记载读入s需要分裂的周期
        bool flag = true;
        scanf("%d", &s);
        for(int i = 1; i <= cnt && s; i++)  // 检查m1的每一个质因数是否都是s的因数
        {
            int a = 0;
            if(s % p[i]) // 如果m1的质因数p[i]不是s的因数,则s不可能被m1^m2除尽
            {
                flag = false;
                break;
            }

            while(s % p[i] == 0)  // 如果能除尽,则统计s内有多少个p[i]
            {
                a++;
                s /= p[i];
            }
            maxn = max(maxn, (c[i]*m2 + a - 1)/a); // s的分裂周期为s的质因数中分裂周期最多的那个。举例:质因数2需要分裂5次能满足,质因数3需要分裂2次就能满足,则s的分裂周期为5
        }
        if(!flag) continue;
        ans = min(ans, maxn);  // 在所有的s种,找一个分裂周期最小的
    }
    
    if(ans == INF) printf("-1\n");
    else  printf("%d\n", ans);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599555.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib和pandas与numpy

1.matplotlib介绍 一个2D绘图库&#xff1b; 2.Pandas介绍&#xff1a; Pandas一个分析结构化数据的工具&#xff1b; 3.NumPy 一个处理n纬数组的包&#xff1b; 4.实践&#xff1a;绘图matplotlip figure()生成一个图像实例 %matplotlib inline&#xff1a;图形直接在…

前端传递list(数组)类型参数,后端接收失败

一顿报错,我之前遇到的list都是Long类型 貌似用GET也是可以的,但是很奇怪一直报错 就是不可以 后来去百度 查询到可以用两种方法解决这个问题 1、拆开 传 以GET方式&#xff0c;后端GetMappingRequestParam接收。 2、以Post方式传&#xff0c;后端创建dto PostMappingReques…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下&#xff1a; 只粘贴了js方法哦&#xff0c; methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

光电探测器性能指标测试

光电探测器的三个核心指标&#xff1a; 带宽&#xff0c;转换增益&#xff0c;噪声(信噪比&#xff0c;NEP&#xff0c;噪声密度) 测试环境&#xff1a;可调谐激光器&#xff08;CW LASER&#xff09;&#xff0c;强度调制器(AM)&#xff0c;信号发生器(AWG)&#xff0c;可调衰…

【算法】滑动窗口——最大连续1的个数

本篇文章讲的是“最大连续1的个数”这道题&#xff0c;从最开始的简单暴力到用滑动窗口算法实现解题的思路历程&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解3.滑动窗口解法3.1优化一&#xff1a;end重返start优化&#xff0c;end指针不回退3.2优化二&#xff1a;某一st…

Day_2

1. 菜品管理 新增菜品 接口设计 1. 根据类型查询分类&#xff08;分类管理已完成&#xff09; 查看接口文档即可 2. 文件上传 创建Bucket 采用的是阿里云的OSS对象存储服务 新增AccessKey 3. 菜品的新增逻辑 代码开发 1. 文件上传接口开发 为了提高代码的解耦性&#…

Java_方法引用

方法引用就是把已经有的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体。 条件&#xff1a; 1.引用处需要是函数式接口 2.被引用的方法需要已经存在 3.被引用的方法的形参和返回值需要跟抽象方法的形参和返回值保持一致 4.被引用方法的功能需要满足当前的要求 简…

ATA-2161高压放大器用途有哪些种类

高压放大器是一种电子设备&#xff0c;其主要功能是将输入信号放大到较高的电压水平&#xff0c;同时保持信号的形状和特性。这种设备在各种应用领域中都有重要作用&#xff0c;它的种类繁多&#xff0c;根据不同的用途可以分为多种类型。 1.医学领域 在医学设备中&#xff0c;…

搭建Harbor仓库

文章目录 Harbor仓库搭建Harbor仓库安装 docker 服务修改配置文件 Harbor仓库 搭建Harbor仓库 下载 Harbor 仓库 安装 docker 服务 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-m…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

Java性能优化(五)-多线程调优-Lock同步锁的优化

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…

《QT实用小工具·五十九》随机图形验证码,带有一些可人的交互与动画

1、概述 源码放在文章末尾 该项目实现了可交互的动画验证码控件&#xff0c;趣味性十足&#xff1a; 字符变换动画 噪音动画 可拖动交互 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef CAPTCHAMOVABLELABEL_H #define CAPTCHAMOVABLELABEL…

【影片欣赏】【指环王】【魔戒:护戒使者 The Lord of the Rings: The Fellowship of the Ring】

2001年发行&#xff0c;Extended DVD Edition Part One 1. Prologue: One Ring to Rule Them All… 2. Concerning Hobbits 3. The Shire 4. Very Old Friends 5. A Long-expected Party 6. Farewell Dear Bilbo 7. Keep It Secret, Keep It Safe 8. The Account of Isildur 9…

MyBatis入门例子

1、建立与数据库对应的POJO类 2、建立mybatis的配置文件 修改后如下&#xff1a; 3、创建POJO对象和Mysql数据的表之间的映射配置 4、建一个测试方法 实现从数据库中取数一条数据&#xff0c;封装成User对象返回 注意点&#xff1a; 这点&#xff0c;大家应该不陌生了&#x…

28-代码随想录18四数之和

18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff…

小米手机miui14 android chrome如何取消网页自动打开app

搜索媒体打开应用 选择你要阻止打开的app&#xff0c;以github为例 取消勾选打开支持的链接。 参考&#xff1a;https://www.reddit.com/r/chrome/s/JBsGkZDkRZ

【进程终止】退出信号 | 三种退出情况 | 如何进程终止returnexit_exit

目录 退出码 退出信号 进程终止情况3 如何进程终止 return退出 库函数exit 系统调用函数_exit ​exit和_exit的区别缓冲区 exit _exit 退出码 回顾上篇 代码跑完&#xff0c;结果正确&#xff08;退出码为0&#xff09;代码跑完&#xff0c;结果不正确&#xff08;退…

批量将GOID转成GO term名并添加BP,MF,CC分类信息

基因本体论&#xff08;Gene Ontology&#xff0c;GO&#xff0c;https://www.geneontology.org&#xff09;是一个广泛应用于生物信息学领域的知识库&#xff0c;它提供了一套标准化的词汇和分类体系&#xff0c;用于描述基因功能、细胞组分和生物过程。GO旨在统一科研人员对基…

C/C++ BM30 二叉搜索树与双向链表

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题要明白二叉搜索树的概念&#xff0c;同时还要对链表的知识比较熟悉。 题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范…

在QEMU上运行OpenSBI+Linux+Rootfs

在QEMU上运行OpenSBILinuxRootfs 1 编译QEMU2 安装交叉编译工具3 编译OpenSBI4 编译Linux5 创建根文件系统5.1 编译busybox5.2 创建目录结构5.3 制作文件系统镜像5.3.1 创建 ext2 文件5.3.2 将目录结构拷贝进 ext2 文件5.3.3 取消挂载 6 运行OpenSBILinuxRootfs 本文所使用的版…