P1069 细胞分裂

题目描述

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

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

注意,整个实验过程中不允许分割单个细胞,比如某个时刻若培养皿中有\(4\)个细胞,

\(Hanks\)博士可以把它们分入\(2\)个试管,每试管内\(2\)个,然后开始实验。但如果培养皿中有\(5\)个细胞,博士就无法将它们均分入\(2\)个试管。此时,博士就只能等待一段时间,让细胞们继续分裂,使得其个数可以均分,或是干脆改换另一种细胞培养。

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

输入输出格式

输入格式:

第一行有一个正整数\(N\),代表细胞种数。

第二行有两个正整数\(m1,m2\)以一个空格隔开,即表示试管的总数\(M = m_1^{m_2}\)

第三行有\(N\)个正整数,第\(i\)个数\(S_i\)表示第\(i\)种细胞经过\(1\)秒钟可以分裂成同种细胞的个数。

输出格式:

输出文件 cell.out 共一行,为一个整数,表示从开始培养细胞到实验能够开始所经过的最少时间(单位为秒)。

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


本蒟蒻十分不擅长做数学题,于是决定认真对待每一道数学题。

来分析一波,我们需要满足这个式子

  • \(m_1^{m_2}|S_i^{q}\)

我们要找到最小的整数\(q\)值

当然,我们不可能把这个乘开看看能否整除,而应该分解质因数比较。

将\(m_1\)分解,对她的质因数\(q_i\)乘以\(m_2\),在看看要多少个\(S_i\)凑到一起去才能搞到比\(q_i*m_2\)还多的质因子\(q_i\),于是对于每个\(S_i\),我们都可以求的她的最小要求数。

取最小的即可。


code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=30010;
const int inf=0x3f3f3f3f;
int n,m1,m2,cnt=0;
int a[N];//分解m1后质因子的个数
int pre[N],is_pre[N];

void seperate()
{
    memset(a,0,sizeof(a));
    int i=1,mm=m1;
    while(mm&&i<=cnt)
    {
        while(mm&&mm%pre[i]==0)
        {
            mm/=pre[i];
            a[pre[i]]++;
        }
        i++;
    }
    for(int i=1;i<=m1;i++)
        a[i]*=m2;
}

int main()
{
    memset(is_pre,1,sizeof(is_pre));
    cin>>n>>m1>>m2;
    for(int i=2;i<=m1;i++)
    {
        if(is_pre[i])
            pre[++cnt]=i;
        for(int j=1;pre[j]*i<=m1&&j<=cnt;j++)
        {
            is_pre[pre[j]*i]=false;
            if(i%pre[j]==0) break;
        }
    }
    seperate();
    int s,m_min=inf,m_max=0;
    for(int i=1;i<=n;i++)
    {
        int flag=0;
        m_max=0;
        scanf("%d",&s);
        for(int j=2;j<=m1;j++)
            if(a[j])
            {
                if(s%j!=0)
                {
                    flag=1;
                    break;
                }
                int cnt=0;
                while(s%j==0)
                {
                    cnt++;
                    s/=j;
                }
                if(a[j]%cnt==0)
                    m_max=max(m_max,a[j]/cnt);
                else
                    m_max=max(m_max,a[j]/cnt+1);
            }
        if(m_max&&!flag&&m_min>m_max)
            m_min=m_max;
    }
    if(m1==1&&n!=0)
    {
        printf("0\n");
        return 0;
    }
    if(m_min==inf)
        cout<<"-1"<<endl;
    else
        cout<<m_min<<endl;
    return 0;
}

2018.4.25

洛谷 P1069 解题报告的更多相关文章

  1. 洛谷 P1462 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  2. 洛谷 P1879 解题报告

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...

  3. 洛谷 P2491 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  4. 洛谷 P2587 解题报告

    P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...

  5. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  6. 洛谷 P1053 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  7. 洛谷 P1057 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  8. 洛谷 P1430 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

  9. 洛谷 P1613 解题报告

    P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...

随机推荐

  1. js中return false,return,return true的用法及区别

    首先return作为返回关键字,他有以下两种返回方式 1.返回控制与函数结果 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 2.返回控制无函数结果 语 ...

  2. css之盒子模型案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. OC第一天——面向对象

    1.OC: Object- C ,面向对象的语言 2.OC 和 C的区别: <1> oc是 c的超集 ,oc是在c语言的基础上做了扩展,c语言中的所有语法,在oc中都可以使用,甚至你可以在 ...

  4. 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流

    GitHub操作总结 : 总结看不明白就看下面的详细讲解. . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details ...

  5. hadoop的节点间的通信

    一个DataNode上的Block是唯一的,多个DataNode可能有相同的Block. 2)通信场景: (1)NameNode的映射表上不永久保存每个DataNode所对应的block信息,而是通过 ...

  6. web报表工具FineReport的SQL编辑框的语法简介

    感谢大家捧场,这里继续分享关于SQL编辑框的一些语法心得总结,因为数据集定义的面板,也是FineReport报表中最常用的模块之一. 1.我理解的执行过程. 这里其实是生成一个字符串,FineRepo ...

  7. 创建Sencha touch第一个应用

    最近学习Sencha touch ,是一个菜鸟级别.废话不多说,让我们来创建Sencha touch的第一应用. 首先,我们下载Sencha touch2.0 sdk 和SDK工具.  SDK工具直接 ...

  8. Oracle :%TYPE 和 %ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...

  9. 移动web前端开发时注意事项(转)

    在智能手机横行的时代,作为一个web前端,不会编写移动web界面,的确是件悲催的事情.当公司准备做一个微信的微网站时,作为一个多年经验的web前端码农,我迷茫了,真心不知道从何下手. 接下来就是搜一堆 ...

  10. 对DB2常见错误的列举以及破解方案

    我们今天主要描述的是DB2常见错误还有正对这些错误的解决方案,以下就是文章对DB2常见错误还有正对这些错误的解决方案的主要内容的详细描述. 以下的文章主要是介绍DB2常见错误还有正对这些错误的解决方案 ...