cell

​         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 个试管”时停止细胞培养并开始实验。现在博士希望知道,选择哪种细 胞培养,可以使得实验的开始时间最早。


输入


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


第二行有两个正整数 m1,m2,以一个空格隔开,m1^ m2 即表示试管的总数M。


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


输出


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


样例输入


样例输入1




1




2 1




3










样例输入2




2




24 1




30 12


样例输出


-1




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










2




【输入输出样例2 说明】 第 1 种细胞最早在3 秒后才能均分入24 个试管,而第2 种最早在2 秒后就可以均分(每 试管144/(241)=6 个)。故实验最早可以在2 秒后开始。


数据范围限制


【数据范围】


对于 50%的数据,有m1^m2 ≤ 30000。


对于所有的数据,有1 ≤N≤ 10000,1 ≤m1 ≤ 30000,1 ≤m2 ≤ 10000,1 ≤ Si ≤ 2,000,000,000。

uses math;
const t:longint=49990001;
var
        a,b,c,d,ans,e,f,ans1,ans2,g,e1,b1:longint;
        v,r:array[0..1500]of qword;
        p:boolean;
begin
        //assign(input,'1.in');reset(input);
        assign(input,'cell.in');reset(input);
        assign(output,'cell.out');rewrite(output);
        ans:=maxlongint;
        readln(a);
        readln(b,c);
        b1:=b;
        if b=1 then
        begin
                writeln(0);
                halt;
        end;
        for d:=2 to b do
        begin
                if b=1 then break;
                if b mod d=0 then
                begin
                        inc(v[0]);
                        inc(r[0]);
                        v[v[0]]:=d;
                end;
                while b mod d=0 do
                begin
                        b:=b div d;
                        inc(r[r[0]]);
                end;
                if b1 mod d=0 then
                        r[r[0]]:=r[r[0]]*c;
        end;
        for d:=1 to a do
        begin
                read(e);
                e1:=e;
                p:=false;
                ans1:=0;
                ans2:=0;
                for g:=1 to v[0] do
                begin
                        if e mod v[g]<>0 then
                        begin
                                p:=true;
                                break;
                        end;
                        f:=0;
                        while e mod v[g]=0 do
                        begin
                                e:=e div v[g];
                                inc(f);
                        end;
                        ans2:=r[g] div f;
                        if (r[g] mod f)<>0 then inc(ans2);
                        if r[g]<f then dec(ans2);
                        ans1:=max(ans1,ans2);
                end;
                if (p=false) then
                        ans:=min(ans,ans1);
        end;
        if ans=t then ans:=5000;
        if ans=maxlongint then writeln(-1) else writeln(ans);
        close(input);
        close(output);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值