#P1002. [NOIP2009普及组] 细胞分裂

news2024/11/15 21:51:59

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

Hanks 博士手里现在有 NN 种细胞,编号从 1 \sim N1∼N,一个第 ii 种细胞经过 11 秒钟可以分裂为 S_iSi​ 个同种细胞(S_iSi​ 为正整数)。现在他需要选取某种细胞的一个放进培养皿,让其自由分裂,进行培养。一段时间以后,再把培养皿中的所有细胞平均分入 MM 个试管,形成 MM 份样本,用于实验。Hanks 博士的试管数 MM 很大,普通的计算机的基本数据类型无法存储这样大的 MM 值,但万幸的是,MM 总可以表示为 m_1m1​ 的 m_2m2​ 次方,即 M = m_1^{m_2}M=m1m2​​,其中 m_1,m_2m1​,m2​ 均为基本数据类型可以存储的正整数。

注意,整个实验过程中不允许分割单个细胞,比如某个时刻若培养皿中有 44 个细胞,Hanks 博士可以把它们分入 22 个试管,每试管内 22 个,然后开始实验。但如果培养皿中有 55 个细胞,博士就无法将它们均分入 22 个试管。此时,博士就只能等待一段时间,让细胞们继续分裂,使得其个数可以均分,或是干脆改换另一种细胞培养。

为了能让实验尽早开始,Hanks 博士在选定一种细胞开始培养后,总是在得到的细胞“刚好可以平均分入 MM 个试管”时停止细胞培养并开始实验。现在博士希望知道,选择哪种细胞培养,可以使得实验的开始时间最早。

输入格式

第一行,有一个正整数 NN,代表细胞种数。

第二行,有两个正整数 m_1,m_2m1​,m2​,以一个空格隔开,即表示试管的总数 M = m_1^{m_2}M=m1m2​​。

第三行有 NN 个正整数,第 ii 个数 S_iSi​ 表示第 ii 种细胞经过 11 秒钟可以分裂成同种细胞的个数。

输出格式

一个整数,表示从开始培养细胞到实验能够开始所经过的最少时间(单位为秒)。

如果无论 Hanks 博士选择哪种细胞都不能满足要求,则输出整数 -1−1。

输入数据 1

1 
2 1 
3

Copy

输出数据 1

-1

Copy

输入数据 2

2
24 1
30 12

Copy

输出数据 2

2

Copy

提示

【输入输出样例 #1 说明】

经过 11 秒钟,细胞分裂成 33 个,经过 22 秒钟,细胞分裂成 99个,……,可以看出无论怎么分裂,细胞的个数都是奇数,因此永远不能分入 22 个试管。

【输入输出样例 #2 说明】

第 11 种细胞最早在 33 秒后才能均分入 2424 个试管,而第 22 种最早在 22 秒后就可以均分(每试管 144 / {24}^1 = 6144/241=6 个)。故实验最早可以在 22 秒后开始。

【数据范围】

对于 50 \%50% 的数据,有 m_1^{m_2} \le 30000m1m2​​≤30000。

对于所有的数据,有 1 \le N \le 100001≤N≤10000,1 \le m_1 \le 300001≤m1​≤30000,1 \le m_2 \le 100001≤m2​≤10000,1 \le S_i \le 2 \times {10}^91≤Si​≤2×109。

NOIP 2009 普及组 第三题

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int read()                            //读入优化 
{
    char ch=getchar();
    int a=0,x=1;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') x=-x;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        a=(a<<3)+(a<<1)+(ch-'0');
        ch=getchar();
    }
    return a*x;
}
int n,m1,m2,minx,gcdd,m,s,q,t,flag,tot,ans,tots,totq;        //t代表q能分解成多少个s         
int S[10001];
int gcd(int a,int b)                  //欧几里得算法求最大公约数 
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main()
{
    n=read();
    m1=read();
    m2=read();
    minx=1e9;
    if(m1==1)                             //这里一定要注意特判m1==1的情况,不然会TLE 
    {
        cout<<0;                          //无需等待,因为任何数都是1的倍数 
        return 0;
    }
    for(int i=1;i<=n;i++) S[i]=read();
    for(int i=1;i<=n;i++)                 
    {
        tot=0;
        m=m1;                             //拷贝一份m1的值
        s=S[i];                           //拷贝一份S[i]的值 
        flag=1;                           //判断是否有解 
        t=0;                              //记录最大公约数要减几个m2 
        while(m!=1)
        {
            gcdd=gcd(m,s);                //第一小步,求最大公约数 
            if(gcdd==1) {flag=0;break;}   //如果互质,那么肯定无解,直接跳出 
            m/=gcdd;                      //左边剩下了m/gcdd 
            q=s/gcdd;                     //q就是s除以gcdd后剩下的数 
            s=gcdd;                       //右边剩下了gcdd         
            t++;                          //每进入一次循环,就要多减1个m2   
        } 
        if(flag)
        {
            int gc=gcd(q,s);        //先求出gcd(q,s) 
            if(gc!=1&&gc!=s)        //单独讨论第三种情况 
            {
                totq=0;tots=0;      //注意清空 
                while(q%gc==0)      //如果q中含有gc就分离 
                {
                    totq++;         //q中含有gc的个数 
                    q/=gc;
                }
                while(s%gc==0)      //如果s中含有gc就分离 
                {
                    tots++;         //s中含有gc的个数 
                    s/=gc;
                }
                if((t*m2*tots+totq*(t-1)*m2)%(tots+totq)==0)    //这种情况的公式,注意向上取整 
				   ans=(t*m2*tots+totq*(t-1)*m2)/(tots+totq);   
                else ans=(t*m2*tots+totq*(t-1)*m2)/(tots+totq)+1;
                minx=min(minx,ans);
            }
            else                   //第一,二种情况 
            {
                while(q%s==0)      //如果q里面含有s,分离出来 
                {
                    tot++;         //tot表示能分离出来多少个s,第一种情况就是tot=0的情况 
                    q/=s;           
                }
                if((t*m2+tot*(t-1)*m2)%(tot+1)==0)    //我不知道为什么ceil出来的答案不对,只能自己模拟向上取整了 
                   ans=(t*m2+tot*(t-1)*m2)/(tot+1);   //没余数说明正好整除 
                else ans=(t*m2+tot*(t-1)*m2)/(tot+1)+1;//如果有余数就要+1(这个1就是余数除成小数后再向上取整后得到的) 
                minx=min(minx,ans);        //题目要求整体最小时间 
            }
        }
    }
    if(minx==1e9) cout<<-1;        //如果minx没被更新,说明无解 
    else cout<<minx;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day17-二叉树的迭代遍历

二叉树的迭代遍历 二叉树的递归遍历是比较简单的 前序中序后序 前序遍历 前序遍历代码如下&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;preorder(root,res);return res;}void preorder(TreeNode* …

进度条 Vue2 +PC端 ,点击页面加载时页面顶部的那个蓝条

提示&#xff1a; <div class"global-loading"> </div> css:less <style lang"less"> .global-loading {background-color: red;height: 10px;position: fixed;z-index: 999;width: 0;animation: grow 2s infinite forwards;}keyframe…

ROS从入门到精通6-8:costmap代价地图插件编写案例(prohibition_layer)

目录 0 专栏介绍1 为什么需要代价地图插件?2 自定义代价地图插件3 仿真测试0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 🚀详情:《ROS从入门到精通》 1 为什么需要代价地图插…

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示&#xff1a;这个命令对网络有要求&#xff0c;可能需要翻墙或者用你的手机热点试试&#xff0c;或者把DNS换成&#xff08;114.114.114.114 和 8.8.8.8&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

tensorRT模型性能测试

目录 前言1. 模型训练1.1 模型1.2 数据集1.3 xml2yolo1.4 yolo2json1.5 json2yolo1.6 训练 2. TRT模型转换2.1 YOLOv5 ONNX导出2.2 YOLOv6 ONNX导出2.3 YOLOv5 engine生成2.4 YOLOv6 engine生成 3. TRT模型测试3.1 YOLOv5 engine mAP测试3.2 YOLOv5 engine 速度测试3.3 YOLOv6 …

代码随香录算法训练营day16 | 104. 二叉树的最大深度,559. N 叉树的最大深度,111. 二叉树的最小深度,222. 完全二叉树的节点个数

目录 104. 二叉树的最大深度 559. N 叉树的最大深度 111. 二叉树的最小深度 222. 完全二叉树的节点个数 104. 二叉树的最大深度 学了回溯之后再来做一下 思路&#xff1a; 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取…

chatgpt 接口使用(一)

使用api实现功能 参考链接&#xff1a;https://platform.openai.com/examples 安装库&#xff1a; pip3 install openai 例如&#xff1a; import os import openaiopenai.api_key os.getenv("OPENAI_API_KEY") response openai.ChatCompletion.create(model&q…

Flutter:使用url_launcher打开外部浏览器、拨打电话、发送短信、打开第三方app、打开应用商店下载应用

前言 Flutter中的url_launcher是一个用于打开URL的插件。它允许在Flutter应用程序中打开网址、发送电子邮件、拨打电话等操作。使用url_launcher插件&#xff0c;可以轻松地在应用程序中集成各种URL操作。 官方地址 https://pub-web.flutter-io.cn/packages/url_launcher 安…

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前 一、概述 在项目开发中&#xff0c;遇到一个类似于 超时关闭的订单&#xff08;超过1分钟后关闭订单&#xff09; 的需求&#xff0c;在数据的时间写入时&#x…

【Python机器学习】实验06 KNN最近邻算法

文章目录 KNN算法前言 距离度量(1) 欧式距离(2) 曼哈顿距离(Manhattan distance)(3) 切比雪夫距离(Chebyshev distance)(4) 闵可夫斯基距离(Minkowski distance)(5) 汉明距离(Hamming distance)(6) 余弦相似度(Cosine Similarity) KNN算法介绍1 数据的准备2 划分训练数据和测试…

C++11 线程库

1 thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库…

利用AI倾听熊猫爱的声音,预测交配成功

大熊猫是世界上最受喜爱的动物之一。原产于中国中部和西南部的山脉&#xff0c;具有独特的黑眼睛和黑白外套的熊于1990年被列入国际自然保护联盟&#xff08;IUCN&#xff09;濒危名单。它们的地位在2016年升级为易危物种&#xff0c;世界自然基金会估计现在大约有1&#xff0c…

计算机视觉常用数据集介绍

1 MINIST MINIST 数据集应该算是CV里面最早流行的数据了&#xff0c;相当于CV领域的Hello World。该数据包含70000张手写数字图像&#xff0c;其中60000张用于train&#xff0c; 10000张用于test&#xff0c; 并且都有相应的label。图像的尺寸比较小&#xff0c; 为28x28。 数…

QTableWidget setSortingEnable 函数使用详解

Qt助手的解释 If enable is true, enables sorting for the table and immediately trigger a call to sortByColumn() with the current sort section and order Note: Setter function for property sortingEnabled. 如果将 enable 设置为 true 那么就会立即调用 sortByColum…

真正帮你实现—MapReduce统计WordCount词频,并将统计结果按出现次数降序排列

项目整体介绍 对类似WordCount案例的词频统计&#xff0c;并将统计结果按出现次数降序排列。 网上有很多帖子&#xff0c;均用的相似方案&#xff0c;重写某某方法然后。。。运行起来可能会报这样那样的错误&#xff0c;这里实现了一种解决方案&#xff0c;分享出来供大家参考…

DHCP防护原理

电脑刚连接到网络 是没有IP地址的 。 通过发送广播到DHCPO服务器。 DHCP服务器响应对应的 IP地址&#xff08;简要过程&#xff09;。 如果有人私自挂接WIFI&#xff0c;相当于DHCP服务器&#xff0c;但这个DHCP服务器是假的&#xff0c;就会引起电脑接入获取家用WIFI的地址&…

十三.redis主从复制

概念 主从复制&#xff0c;指将一台redis服务器的数据&#xff0c;复制到其它的redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。master以写为主&#xff0c;slave以读为主。 默认情况…

小研究 - 面向 Spring 的热点代码在线部署方法研究(三)

随着Spring生态不断发展,越来越先进的部署方式降低了部署的复杂度,提高了不同环境下的部署效率,但是在预生产环境下,对频繁改动的热点代码,其部署效率不是很理想,一些简单的代码修改就会引发对所有依赖服务的重新编译部署,给项目部署、运维以及测试带来很多预期之外的影响。在线…

设计模式再探——代理模式

目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战&#xff0c;优化后(只加了泛型方式&#xff0c;使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…

【Git】分支管理之创建、切换、合并、删除分支以及冲突处理

目录 一、理解分支 二、创建、切换、合并分支 三、删除分支 四、冲突处理 五、合并模式 六、合并策略 七、Bug分支处理 八、强制删除分支 一、理解分支 master其实就是一个指针 &#xff0c;他指向的是主分支最近一次commit。我们可以创建新的分支&#xff0c;在新的分…