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. C++ Primer 有感(类)

    1.在类内部,声明成员函数时必需 的,而定义成员函数则是可选的.在类内部定义的函数默认为inline. 2.const成员函数不能改变其所操作的对象的数据成员.const必须同时出现在声明和定义中,若 ...

  2. (NO.00001)iOS游戏SpeedBoy Lite成形记(十七)

    因为现在游戏内容原来越多了,里面需要存储的数据也多了起来,所以一个较好的办法是将所有的比赛数据存到同一个地方便于存取. 我们需要新建一个游戏数据类,该类贯穿所有需要的场景,存放一切比赛需要的数据.从这 ...

  3. 江湖问题研究-- intent传递有没有大小限制,是多少?

    出门一步,便是江湖,江湖上有许多流言. 比如这条: intent传递是有大小限制的,具体在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜惨叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...

  4. Git添加文件改动时出错

    原来的主文件夹中替换了3个子文件夹,每个子文件夹有若干同名文件,总共替换了大概200多个文件吧. 然后在git主文件夹中使用git add .指令出现如下错误: apple@kissAir: iOS$ ...

  5. 菜鸟玩云计算之二十:saltstack入门初步

    菜鸟玩云计算之二十 SaltStack 入门初步 0. saltstack 是什么 参考下面的文章: http://docs.saltstack.com/en/latest/topics/tutori ...

  6. STL算法设计理念 - 二元函数,二元谓词以及在set中的应用

    demo 二元函数对象 #include <iostream> #include <cstdio> #include <vector> #include <a ...

  7. 四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。

    四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient regio ...

  8. iOS中UITableView分割线左侧顶齐

    iOS 7开始UITableView的分割线不在从左侧边界开始了,而是默认空出了一段距离. 如果想要使用默认的分割线而且还要从左侧边界开始的话,有几种解决方式: 1.在tableView的代理方法中设 ...

  9. 【资源分享】云计算 CRM 等网上搜集资料

    持续更新,作为抛砖引玉,如果您有更好.更新的资源,望大家分享.共同学习.详细信息尽在 华夏编程社区(HackProLabs)-------------------------------------- ...

  10. vi/vim下看十六进制文件

    :%!xxd --将当前文本转换为16进制格式. 查看内容是对应的.你可以后面看到对应的字符内容 :%!od --将当前文本转换为16进制格式. :%!xxd -c 12--将当前文本转换为16进制格 ...