【NOIP2009】第三题·细胞分裂

题目描述 Description

Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家。现在,他正在为一个细胞实验做准备工作:培养细胞样本。
Hanks
博士手里现在有N 种细胞,编号从1~N,一个第i 种细胞经过1 秒钟可以分裂为Si 个同种细胞(Si
为正整数)。现在他需要选取某种细胞的一个放进培养皿,让其自由分裂,进行培养。一段时间以后,再把培养皿中的所有细胞平均分入M 个试管,形成M
份样本,用于实验。Hanks 博士的试管数M 很大,普通的计算机的基本数据类型无法存储这样大的M 值,但万幸的是,M 总可以表示为m1 的m2
次方,即M = m1^ m2 ,其中m1,m2 均为基本数据类型可以存储的正整数。
注意,整个实验过程中不允许分割单个细胞,比如某个时刻若
培养皿中有4 个细胞,Hanks 博士可以把它们分入2 个试管,每试管内2 个,然后开始实验。但如果培养皿中有5个细胞,博士就无法将它们均分入2
个试管。此时,博士就只能等待一段时间,让细胞们继续分裂,使得其个数可以均分,或是干脆改换另一种细胞培养。
为了能让实验尽早开始,Hanks 博士在选定一种细胞开始培养后,总是在得到的细胞“刚好可以平均分入M 个试管”时停止细胞培养并开始实验。现在博士希望知道,选择哪种细胞培养,可以使得实验的开始时间最早。

输入描述
Input Description

共有三行。
第一行有一个正整数 N,代表细胞种数。
第二行有两个正整数 m1,m2,以一个空格隔开, m1^ m2 即表示试管的总数M。
第三行有 N 个正整数,第i 个数Si 表示第i 种细胞经过1 秒钟可以分裂成同种细胞的个数。

输出描述
Output Description

共一行,为一个整数,表示从开始培养细胞到实验能够开始所经过的最少时间(单位为秒)。
如果无论 Hanks 博士选择哪种细胞都不能满足要求,则输出整数-1。

样例输入
Sample Input

1
2 1
3

样例输出
Sample Output

-1

数据范围及提示
Data Size & Hint

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

代码:

var cup:array[1..30000,1..2] of longint;
  n,m1,m2,length,t,p,i,j,minest,max,k,si:longint;
  f,flag:boolean;
begin
  readln(n);
  readln(m1,m2);
  fillchar(cup,sizeof(cup),0);
  length:=1;
  t:=m1;
  for i:=2 to 2000000000 do
  begin
    if t=1 then break;
    f:=false;
    while t mod i=0 do
    begin
      f:=true;
      inc(cup[length,2]);
      t := t div i;
    end;
    if f then begin cup[length,1]:=i; inc(length); end;
  end;
  dec(length);
  for i:=1 to length do
    cup[i,2]:=cup[i,2]*m2;
  minest:=2000000000;
  for i := 1 to n do
  begin
    read(si);
    if si=1 then continue;
    flag:=true;
    max:=0;
    for j:=1 to length do
    begin
      k:=0;
      while si mod cup[j,1]=0 do
      begin
        si := si div cup[j,1];
        inc(k);
      end;
      if k=0 then begin flag:=false; break; end;
      if cup[j,2] mod k = 0 then p:= cup[j,2] div k
      else p:=cup[j,2] div k +1;
      if p > max then max := p;
    end;
    if flag and (max<minest) then minest:=max;
  end;
  if minest=2000000000 then writeln(‘-1‘)
  else writeln(minest);
end.

题意抽象出来就是求(cell[i])^k mod m1^m2=0的最小的k值。

把m1^m2分解质因数即可,再把每一个细胞数分解,对比其质因子数量,对于某个因子,m1^m2次有而后者没有,那么这种情况一定无解,继续枚举下一个细胞数即可,而两者都有时,就是要最少的后者的因子凑出大于等于后者因子的最小次幂,处理完每一个因子后取因子需要的最大值,用它去更新答案。

注意m1=1时的特殊情况,遇到1直接跳过。

时间: 2024-10-12 07:17:21

【NOIP2009】第三题·细胞分裂的相关文章

NOIP模拟题——细胞分裂

[问题描述]小 A 养了一大坨细胞. 最初小 A 只有 1 个细胞.每秒,小 A 的每个细胞都会分裂成 2 个细胞. 已知:现在离“最初”已经过去了x秒,那么现在的细胞数当然是可以计算的. 小 A 想知道的当然不是当前的细胞数.小 A 知道他养的细胞的习性:每 y 个细胞会聚成一团.经常会有剩下的细胞,那么我们称这些细胞是孤独的. 小 A 想知道的就是孤独的细胞个数.[输入文件]输入文件为 cell.in. 输入文件共一行,为两个整数 xy,以空格隔开.[输出文件]输出文件为 cell.out.

cogs 466. [NOIP2009] 细胞分裂

466. [NOIP2009] 细胞分裂 ★★   输入文件:cell.in   输出文件:cell.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]    Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本.    Hanks 博士手里现在有N 种细胞,编号从1~N,一个第i 种细胞经过1 秒钟可以分裂为Si 个同种细胞(Si 为正整数).现在他需要选取某种细胞的一个放进培养皿,让其自由分裂,

细胞分裂(洛谷 P1069)

题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个第 i 种细胞经过 1 秒钟可以分裂为 Si个同种细胞(Si为正整数).现在他需要选取某种细胞的一个放进培养皿,让其自由分裂, 进行培养.一段时间以后,再把培养皿中的所有细胞平均分入 M 个试管,形成 M 份样本, 用于实验.Hanks 博士的试管数 M 很大,普通的计算机的基本数据类型无法存储这样

P1069 细胞分裂

题目描述 HanksHanks 博士是 BTBT ( Bio-TechBio−Tech ,生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. HanksHanks 博士手里现在有 NN 种细胞,编号从 1-N1−N ,一个第 ii 种细胞经过 11 秒钟可以分裂为 S_iSi? 个同种细胞( S_iSi?为正整数).现在他需要选取某种细胞的一个放进培养皿,让其自由分裂,进行培养.一段时间以后,再把培养皿中的所有细胞平均分入 MM 个试管,形成 MM 份样本,用于实验

2014马哥Linux0217中对0214三题的解答

前几天在做2014马哥Linux0214的作业的时候,发现其实这三题在0217中有解答,当然觉得马哥比自己写得好太多,所以忍不住要把马哥的答案贴出来,以供自己学习. 第一题:写一个脚本,用for循环实现显示/etc/init.d/functions./etc/rc.d/rc.sysinit./etc/fstab有多少行 #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab;do line

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

LeetCode 第三题,Longest Substring Without Repeating Characters

题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest s

Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”. 有如下List List list = new ArrayList(); list.add(new Student(“Tom”, 18, 100, “class05”)); list.add(new Student(“Jerry”,

NOIP2005-普及组复赛-第三题-采药

题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大.” 如果你是辰辰,你能完成这个任务吗? 输入输出格式 Input/output 输入格式:输