题解

14 条题解

  • 1
    @ 2021-08-21 11:14:58
    #include<bits/stdc++.h>
    using namespace std;
    
    int n,m1,m2,minx,gcdd,m,s,q,t,flag,tot,ans,tots,totq;       
    int S[10001];
    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 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)
        {
            cout<<0;
            return 0;
        }
        for(int i=1;i<=n;i++)
            S[i]=read();
        for(int i=1; i<=n; i++)                 
        {
            tot=0;
            m=m1;
            s=S[i];
            flag=1;
            t=0;
            while(m!=1)
            {
                gcdd=gcd(m,s);
                if(gcdd==1){
                    flag=0;
                    break;
                }
                m/=gcdd; 
                q=s/gcdd;
                s=gcdd;      
                t++;
            } 
            if(flag)
            {
                int gc=gcd(q,s);
                if(gc!=1&&gc!=s)
                {
                    totq=0;tots=0;
                    while(q%gc==0)
                    {
                        totq++;
                        q/=gc;
                    }
                    while(s%gc==0)
                    {
                        tots++;
                        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)
                    {
                        tot++;
                        q/=s;           
                    }
                    if((t*m2+tot*(t-1)*m2)%(tot+1)==0)    
                       ans=(t*m2+tot*(t-1)*m2)/(tot+1);
                    else
                        ans=(t*m2+tot*(t-1)*m2)/(tot+1)+1;
                    minx=min(minx,ans);
                }
            }
        }
        if(minx==1e9)
            cout<<-1;
        else
            cout<<minx;
        return 0;
    } 
    
  • 1
    @ 2017-07-26 11:12:32

    之前没有管1个试管的特判,第一个点错了无数次;
    可能是最近学数论,将题目看做求解: s[i]^x ≡0(mod m1^m2) 简直太傻逼了;
    提示:本体就是一个唯一分解定理的应用:a|b≡b包括a中所有质因数,且数目大于等于b所有质因数
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<climits>
    typedef long long LL;
    const LL inf=LLONG_MAX;
    inline const void read(LL &a)
    {
    a=0;
    char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')
    {
    a=a*10+c-'0';
    c=getchar();
    }
    }
    bool prime[30001];
    LL n,s,ans=inf;//病毒数 分裂数 最优答案
    LL m1,m2;//试管数m1^m2
    void solve_prime()
    {
    for(LL i=2;i<=30000;i++)
    if(prime[i])
    for(LL j=2;j*i<=30000;j++)prime[i*j]=false;
    }
    LL de[30001],num[30001];
    LL des[30001];
    void devide_m1()
    {
    memset(de,0,sizeof(de));
    memset(num,0,sizeof(num));
    LL a=m1;
    for(LL i=2;i<=m1;i++)
    {
    if(a==1)break;
    if(prime[i])
    while(!(a%i))
    {
    de[0]++;
    de[de[0]]=i;
    num[i]++;
    a/=i;
    }
    }
    for(LL i=1;i<=m1;i++)num[i]*=m2;
    }
    inline const void devide(LL c)
    {
    LL a=c;
    memset(des,0,sizeof(des));
    for(LL i=2;i<=m1;i++)
    {
    if(prime[i])
    while(!(a%i))
    {
    des[i]++;
    a/=i;
    if(a==1)return ;
    }
    }
    }
    inline const LL big(LL a,LL b)
    {
    if(a>b)return a;
    else return b;
    }
    inline const LL small(LL a,LL b)
    {
    if(a>b)return b;
    else return a;
    }
    int main()
    {
    memset(prime,true,sizeof(prime));
    prime[0]=prime[1]=false;
    solve_prime();
    read(n);read(m1);read(m2);
    devide_m1();
    if(m1==1||m2==0)//特判1
    {
    printf("%d",0);
    return 0;
    }
    for(LL k=1;k<=n;k++)//求解: s^x ≡0(mod m1^m2)
    {
    LL ansk=-inf;
    read(s);
    if(s==1)continue;
    devide(s);
    for(LL i=1;i<=de[0];i++)
    {
    if(des[de[i]])
    ansk=big(LL(ceil(double(num[de[i]])/double(des[de[i]]))),ansk);
    else {ansk=inf;break;}
    }
    ans=small(ansk,ans);
    }
    if(ans==inf)printf("%d",-1);
    else printf("%lld",ans);
    return 0;
    }

  • 0
    @ 2016-12-30 22:24:42

    Is this problem difficult?In fact just prime factors decomposition and extracting.Enumeration of the corresponding prime factors, properties: the basic factors of power remains the same.So we can get the answer.Only six lines of code and deal with details determine prime factors.

  • 0
    @ 2016-11-17 12:13:33
    评测结果
    编译成功
    
    测试数据 #0: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 860 KiB, score = 10
    测试数据 #7: Accepted, time = 31 ms, mem = 864 KiB, score = 10
    测试数据 #8: Accepted, time = 31 ms, mem = 860 KiB, score = 10
    测试数据 #9: Accepted, time = 46 ms, mem = 864 KiB, score = 10
    Accepted, time = 154 ms, mem = 864 KiB, score = 100
    代码
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    const int INF = 999999999;
    int n,m1,m2,p[30001],num1[30001],num2[30001];
    int main() {
      //freopen("cell.in","r",stdin);
      //freopen("cell.out","w",stdout);
      scanf("%d%d%d",&n,&m1,&m2);
      p[0] = 0;
      for (int i = 2;i*i <= m1;i++)
        if (!(m1%i)) {
          p[++p[0]] = i;
          while (!(m1%i)) {
            m1 /= i;
            num1[p[0]]++;
          }
        }
      if (m1 != 1) {
        p[++p[0]] = m1;
        num1[p[0]] = 1;
      }
      for (int i = 1;i <= p[0];i++) num1[i] *= m2;
      int Min = INF;
      for (int i = 1,x;i <= n;i++) {
        memset(num2,0,sizeof(num2));
        scanf("%d",&x);
        bool flag = false;
        for (int j = 1;j <= p[0];j++)
          if (x%p[j]) {
            flag = true;
            break;
          }
        if (flag) continue;
        for (int j = 1;j <= p[0];j++)
          while (!(x%p[j])) {
            num2[j]++;
            x /= p[j];
          }
        int Max = 0;
        for (int j = 1;j <= p[0];j++)
          if (num1[j] > num2[j]) {
            Max = max(Max,(int)(ceil((double)num1[j]/num2[j])+1e-6));
            if (Max > Min) break;
          }
        Min = min(Min,Max);
      }
      printf("%d",Min == INF ? -1 : Min);
      return 0;
    }
    
  • 0
    @ 2016-11-16 22:22:28

    编译成功

    Free Pascal Compiler version 3.0.0 [2015/11/16] for i386
    Copyright (c) 1993-2015 by Florian Klaempfl and others
    Target OS: Win32 for i386
    Compiling foo.pas
    Linking foo.exe
    56 lines compiled, 0.0 sec, 28272 bytes code, 1268 bytes data
    测试数据 #0: Accepted, time = 0 ms, mem = 928 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 928 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 928 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 932 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 932 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 928 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 932 KiB, score = 10
    测试数据 #7: Accepted, time = 0 ms, mem = 928 KiB, score = 10
    测试数据 #8: Accepted, time = 0 ms, mem = 932 KiB, score = 10
    测试数据 #9: Accepted, time = 15 ms, mem = 928 KiB, score = 10
    Accepted, time = 15 ms, mem = 932 KiB, score = 100
    ```
    var s,a,b:array[0..10000]of longint;
    min,i,j,k,m1,m2,n,t:longint; f:boolean;

    function doit(n:longint):longint;
    var max,m,k,i:longint;
    begin
    max:=-maxlongint;
    for i:=1 to j do
    begin
    m:=0;
    while (n mod a[i]=0) do
    begin inc(m);n:=n div a[i]; end;
    k:=b[i]div m;
    if b[i]mod m<>0 then k:=k+1;
    if k>max then max:=k;
    end;
    doit:=max;
    end;

    procedure prime_main(x:longint);
    var i:longint;
    begin
    i:=2;j:=0;
    while (x<>1) do begin
    if x mod i=0 then
    begin
    inc(j);a[j]:=i;
    while x mod i=0 do
    begin
    x:=x div i;
    inc(b[j]);
    end;
    b[j]:=b[j]*m2;
    end;
    inc(i);end;
    end;

    begin
    readln(n);
    readln(m1,m2);
    for i:=1 to n do read(s[i]);
    if (m1=1)or(m2=0) then begin write('0');halt end;
    prime_main(m1);
    min:=maxlongint;
    // for i:=1 to j do for k:=1 to b[i] do writeln(a[i],' ');halt;
    for i:=1 to n do
    begin
    f:=true;
    for k:=1 to j do
    if (s[i] mod a[k]<>0) then begin f:=false;break;end;
    if f then t:=doit(s[i]);
    if f and (min>t) then min:=t;
    end;

    if min<>maxlongint then writeln(min) else writeln('-1');
    end.```

  • 0
    @ 2015-09-18 17:00:20

    给定m1^m2的大数和n个数s[]
    求s_i^x mod m1^m2=0最小的x

    由于m1<=30000,m2<=10000,根本无法直接计算,所以需要通过数学分析得出答案。
    如果一个数能够整除另一个数,那么这个数因数分解后一定有另一个数所有的元素,且每个元素个

    数均大于等于另一个数相同元素的个数。
    因此我们可以先对m1进行因数分解,并将对应元素的个数乘以m2。
    之后读入每个数,判断该数因数分解后是否有m1中所有的元素。
    如果有的话,则计算该细胞最大的分裂次数(即对应m1种元素个数/si中元素个数后向上取整)。
    枚举分解每一个给定的数,最后更新答案即可。
    因数分解中1比较特殊,要单独判断一下。
    var
    d,di,zi,z:array[0..10000] of longint;
    s,x,m,top,j,i,ans,n,p,q:longint;
    procedure fenjie(n:longint);

    var i:longint; //分解n 底数在d 指数在z 个数为top
    begin
    fillchar(d,sizeof(d),false);
    fillchar(z,sizeof(z),0);
    top:=0;
    i:=2;
    while n<>1 do
    if n mod i=0 then
    begin
    if (i=d[top]) then inc(z[top]) else
    begin
    inc(top);
    d[top]:=i;
    inc(z[top]);
    end;
    n:=n div i;
    end else
    begin
    inc(i);
    if i>trunc(sqrt(n)) then break;
    end;
    if n<>1 then
    begin inc(top); d[top]:=n; inc(z[top]); end;
    end;
    function pan:boolean; //判断次数分解后是否有m1的所有元素
    var o,i,j:longint;
    begin
    s:=0;
    j:=1;
    for i:=1 to m do
    begin
    while (di[i]<>d[j]) do
    begin
    inc(j);
    if j>top+1 then exit(false);
    end;
    if (zi[i]/z[j])-(zi[i] div z[j])>0 //收尾
    then o:=(zi[i] div z[j])+1 else o:=zi[i] div z[j];
    if o>s then s:=o; //要满足最大的
    end;
    exit(true);
    end;
    begin
    read(n);
    read(p,q);
    if p=1 then begin writeln(0); halt; end; //特判1
    fenjie(p);
    m:=top; di:=d; zi:=z;
    for i:=1 to top do zi[i]:=zi[i]*q;
    ans:=123456789;
    for j:=1 to n do
    begin
    read(x);
    fenjie(x);
    if (pan=true) and (s<ans) then ans:=s; //更新答案
    end;
    if ans=123456789 then writeln(-1) else writeln(ans);
    end.

  • 0
    @ 2015-08-23 12:34:19

    非常简单的一题,就是分解质因数,记得判断试管数为1

    您向题目P1814 - 细胞分裂递交的代码已通过评测!
    现将代码发送给您保存:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<ctime>
    #include<queue>
    #include<stack>

    using namespace std;

    int pr_[25],L;
    int t[25];
    int txg[25];

    int main(){
    //freopen("cell.in","r",stdin);
    //freopen("cell.ans","w",stdout);
    int N,m1,m2,tot,i,j,s,ans=0x7fffffff,ansf;
    cin>>N>>m1>>m2;
    for(i=2;i*i<=m1;i++){
    if(m1%i==0)pr_[++L]=i;
    while(m1%i==0){t[L]+=m2;m1/=i;}
    }
    if(m1-1){pr_[++L]=m1;t[L]=m2;}
    for(j=1;j<=N;j++){
    scanf("%d",&tot);s=0;ansf=-1;
    for(i=1;i<=L;i++){
    if(tot%pr_[i]!=0) goto next;
    while(tot%pr_[i]==0){++s;tot/=pr_[i];}
    ansf=max(ansf,(t[i]-1)/s+1);
    }
    ans=min(ans,L==0?0:(ansf==-1?ans:ansf));
    next:;
    }
    cout<<(ans==0x7fffffff?-1:ans);
    return 0;
    }
    如果您不需要此项功能,请到https://vijos.org/home/settings关闭,谢谢。
    这封邮件由Vijos自动发送,请勿直接回复。

  • 0
    @ 2014-10-28 18:59:42

    注意特判试管数为1的情况

  • 0
    @ 2014-08-09 12:10:34

    0ms....
    Code:
    编译成功

    Free Pascal Compiler version 2.6.2 [2013/02/12] for i386
    Copyright (c) 1993-2012 by Florian Klaempfl and others
    Target OS: Win32 for i386
    Compiling foo.pas
    foo.pas(4,5) Note: Local variable "g" not used
    Linking foo.exe
    63 lines compiled, 0.3 sec , 28528 bytes code, 1628 bytes data
    1 note(s) issued
    测试数据 #0: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 848 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #7: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #8: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    测试数据 #9: Accepted, time = 0 ms, mem = 844 KiB, score = 10
    Accepted, time = 0 ms, mem = 848 KiB, score = 100
    代码
    type
    arr=array[1..30000,1..2] of longint;
    var
    ans,g,i,k,n,m1,m2,total:longint;
    a:arr;
    procedure factorization(k:longint;var a:arr;var link:longint);
    var
    i:longint;
    begin
    i:=1;
    link:=0;
    repeat
    inc(i);
    if k mod i=0 then
    begin
    inc(link);
    a[link,1]:=i;
    a[link,2]:=0;
    while k mod i=0 do
    begin
    inc(a[link,2]);
    k:=k div i;
    end;
    end;
    until k=1;
    end;
    procedure main;
    var
    i,z,max:longint;
    begin
    max:=-1;
    read(k);
    for i:=1 to total do
    begin
    if k mod a[i,1]<>0 then exit;
    z:=0;
    while k mod a[i,1]=0 do
    begin
    inc(z);
    k:=k div a[i,1];
    end;
    if (a[i,2]+z-1) div z>max then max:=(a[i,2]+z-1) div z;
    end;
    if max<ans then ans:=max;
    end;
    begin
    ans:=maxlongint;
    readln(n);
    readln(m1,m2);
    if m1=1 then
    begin
    writeln(0);
    halt;
    end;
    factorization(m1,a,total);
    for i:=1 to total do
    a[i,2]:=a[i,2]*m2;
    for i:=1 to n do
    main;
    if ans=maxlongint then writeln(-1)
    else writeln(ans);
    readln;
    readln;
    end.

  • 0
    @ 2014-04-20 12:47:09

    AC370题留恋!

  • 0
    @ 2014-01-01 21:38:10

    ###
    var n,m1,m2,i,j,l,ans,nowans,temp,total:longint;
    x,y,s:array[0..30000]of longint;
    b:boolean;
    procedure FenJieZhiYinShu(n:longint);
    begin
    i:=1;j:=0;
    while n<>1 do
    begin
    i:=i+1;
    if n mod i=0 then
    begin
    j:=j+1;
    x[j]:=i;
    y[j]:=0;
    while n mod i=0 do
    begin
    n:=n div i;
    y[j]:=y[j]+1;
    end;
    end;
    end;
    l:=j;
    end;
    begin
    readln(n);
    readln(m1,m2);
    for i:=1 to n do read(s[i]);
    if(m1=1)or(m2=0)then
    begin
    writeln(0); exit;
    end;
    FenJieZhiYinShu(m1);
    for i:=1 to l do y[i]:=y[i]*m2;
    ans:=maxlongint;
    for i:=1 to n do
    begin
    b:=true; nowans:=0;
    for j:=1 to l do
    begin
    temp:=s[i];
    total:=0;
    while temp mod x[j]=0 do
    begin
    temp:=temp div x[j];
    total:=total+1;
    end;
    if total=0 then begin b:=false;break;end;
    temp:=y[j]div total;
    if y[j]mod total<>0 then temp:=temp+1;
    if nowans<temp then nowans:=temp;
    end;
    if b=false then continue;
    if nowans<ans then ans:=nowans;
    end;
    if ans<>maxlongint then writeln(ans)else writeln(-1);
    end.

  • 0
    @ 2014-01-01 21:36:35

    ###Block Code
    var c,y:array[0..30001] of longint;
    n,m1,m2,z1,z2,t,res,f:longint;
    Procedure check(k:longint);
    var z1,z2,d,max:longint;
    begin
    max:=-1;
    for z1:=1 to t do
    begin
    d:=0;
    while k mod c[z1]=0 do
    begin
    inc(d);
    k:=k div c[z1];
    end;
    If d=0 then exit;
    z2:=y[z1] div d;
    If z2*d<y[z1] then inc(z2);
    If z2>=res then exit;
    If z2>max then max:=z2;
    end;
    res:=max;
    end;
    begin
    readln(n); readln(m1,m2);
    f:=m1;
    for z1:=2 to m1 do
    for z2:=2 to m1 div z1 do c[z1*z2]:=1;
    z2:=1;
    while z2<m1 do
    begin
    inc(z2);
    If (c[z2]=0)and(m1 mod z2=0) then
    begin
    inc(t); c[t]:=z2;
    while m1 mod z2=0 do
    begin
    inc(y[t]);
    m1:=m1 div z2;
    end;
    end;
    end;
    res:=maxlongint;
    for z1:=1 to t do y[z1]:=y[z1]*m2;
    for z1:=1 to n do
    begin
    read(z2);
    check(z2);
    end;
    If f=1 then writeln(0) else
    If res=maxlongint then writeln(-1) else
    writeln(res);
    end.

  • 0
    @ 2013-11-05 22:09:48

    评测结果

    编译成功

    测试数据 #0: Accepted, time = 0 ms, mem = 840 KiB, score = 10

    测试数据 #1: Accepted, time = 15 ms, mem = 836 KiB, score = 10

    测试数据 #2: Accepted, time = 0 ms, mem = 836 KiB, score = 10

    测试数据 #3: Accepted, time = 15 ms, mem = 836 KiB, score = 10

    测试数据 #4: Accepted, time = 171 ms, mem = 836 KiB, score = 10

    测试数据 #5: Accepted, time = 0 ms, mem = 840 KiB, score = 10

    测试数据 #6: Accepted, time = 78 ms, mem = 836 KiB, score = 10

    测试数据 #7: Accepted, time = 62 ms, mem = 836 KiB, score = 10

    测试数据 #8: Accepted, time = 578 ms, mem = 840 KiB, score = 10

    测试数据 #9: Accepted, time = 500 ms, mem = 836 KiB, score = 10

    Accepted, time = 1419 ms, mem = 840 KiB, score = 100
    代码

    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>

    using namespace std;

    int N;
    int m1 , m2 , m3;
    int a[10000 + 10] , b[30000] , c[30000];
    int i , j;
    int tem;
    int getans;
    int maxd , maxe , maxf , tht , tt;

    int main()
    {
    while( scanf( "%d" , &N ) != EOF )
    {
    getans = 0;
    maxd = maxe = 0;
    maxf = 1000000000;
    memset( a , 0 , sizeof( a ) );
    memset( b , 0 , sizeof( b ) );
    memset( c , 0 , sizeof( c ) );
    scanf( "%d %d" , &m1 , &m2 );
    m3 = m1;
    //cout << m3 << endl;
    for( i = 0 ; i < N ; i++ )
    scanf( "%d" , &a[i] );
    while( m1 % 2 == 0 )
    {
    //cout << "f\n";
    m1 /= 2;
    b[2]++;
    }
    for( i = 3 ; i <= m1 ; i += 2 )
    {
    while( m1 % i == 0 )
    {
    //cout << "f\n";
    m1 /= i;
    b[i]++;
    }
    if( m1 == 1 )
    break;
    }
    //cout << "f\n";
    m1 = m3;
    /*for( i = 0 ; i <= m1 ; i++ )
    if( b[i] != 0 )
    cout << i << " " << b[i] << endl;*/
    for( i = 0 ; i <= m1 ; i++ )
    {
    b[i] *= m2;
    maxd = i;
    }
    for( i = 0 ; i < N ; i++ )
    {
    memset( c , 0 , sizeof( c ) );
    tht = 0;
    maxe = 0;
    tem = a[i];
    while( tem % 2 == 0 )
    {
    //cout << "f\n";
    tem /= 2;
    c[2]++;
    }
    for( j = 3 ; j <= m1 ; j += 2 )
    {
    while( tem % j == 0 )
    {
    //cout << "f\n";
    tem /= j;
    c[j]++;
    }
    if( tem == 1 )
    break;
    }
    tt = 1;
    for( j = 0 ; j <= maxd ; j++ )
    {
    if( b[j] != 0 && c[j] == 0 )
    {
    tt = 0;
    break;
    }
    if( b[j] != 0 )
    {
    //cout << j << " " << b[j] << " " << c[j] << endl;
    if( b[j] % c[j] == 0 )
    tht = b[j] / c[j];
    else
    tht = ( int )( b[j] / c[j] ) + 1;
    if( tht > maxe )
    maxe = tht;
    }
    }
    //cout << maxe << endl;
    if( maxe < maxf && tt != 0 )
    maxf = maxe;
    if( tt != 0 )
    getans = 1;
    }
    if( !getans )
    cout << "-1\n";
    else
    cout << maxf << endl;
    }
    return 0;
    }

  • 0
    @ 2013-10-05 19:41:14

    var c,y:array[0..30001] of longint;
    n,m1,m2,z1,z2,t,res,f:longint;

    Procedure check(k:longint);
    var z1,z2,d,max:longint;
    begin
    max:=-1;
    for z1:=1 to t do
    begin
    d:=0;
    while k mod c[z1]=0 do
    begin
    inc(d);
    k:=k div c[z1];
    end;
    If d=0 then exit;
    z2:=y[z1] div d;
    If z2*d<y[z1] then inc(z2);
    If z2>=res then exit;
    If z2>max then max:=z2;
    end;
    res:=max;
    end;

    begin
    readln(n); readln(m1,m2);
    f:=m1;
    for z1:=2 to m1 do
    for z2:=2 to m1 div z1 do c[z1*z2]:=1;
    z2:=1;
    while z2<m1 do
    begin
    inc(z2);
    If (c[z2]=0)and(m1 mod z2=0) then
    begin
    inc(t); c[t]:=z2;
    while m1 mod z2=0 do
    begin
    inc(y[t]);
    m1:=m1 div z2;
    end;
    end;
    end;
    res:=maxlongint;
    for z1:=1 to t do y[z1]:=y[z1]*m2;
    for z1:=1 to n do
    begin
    read(z2);
    check(z2);
    end;
    If f=1 then writeln(0) else
    If res=maxlongint then writeln(-1) else
    writeln(res);
    end.

  • 1

信息

ID
1814
难度
7
分类
(无)
标签
递交数
1412
已通过
323
通过率
23%
被复制
16
上传者