Cod sursa(job #2405029)

Utilizator traiandobrinDobrin Traian traiandobrin Data 13 aprilie 2019 20:35:39
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.61 kb
#include <fstream>
#define int unsigned long long
#define fisier1 ifstream in("magic2.in");
#define fisier2 ofstream out("magic2.out");
//#define in cin
//#define out cout
using namespace std;
int f[105],maxx;
int v[105];
fisier1
fisier2
void ciur()
{   int i,d;
    for(i=2;i<=100;++i)
    {
        v[i]=1;
    }
    for(i=2;i<=100;++i)
    {
        if(v[i])
           {
               for(d=2*i;d<=100;d+=i)
                v[d]=0;
           }
    }
}
void desc(int n)
{
    while(n%2==0 && n>1)
    {
        n/=2;
        f[2]++;
    }
    for(int i=3;i<=100 && n>1;i+=2)
    {
        if(v[i]){
            while(n%i==0)
            f[i]++,n/=i;
            maxx=max(maxx,i);
        }
    }
}
unsigned long long lgput(unsigned long long a,unsigned long long p){
    long long i;
    long long sol=1;
    for (i = 1; i <= p; ++ i)
	{
			sol= (sol * a);
    }
    return sol;
}
int cbin(int n)
{
   int st=1,dr=99,mid;
   while (st<=dr)
   {
       mid=(st+dr)/2;
       if(lgput(mid,2)<n)
        st=mid+1;
       else
        if(lgput(mid,2)>n)
        dr=mid-1;
       else
        return lgput(mid,2);
   }
   return lgput(mid,2);
}
main()
{
    int k,i,m1,m2,o,j,c=0;
    bool x;
    unsigned long long cn,n,put,a,b,rez=0;
    in>>k;
    n=0;
    put=1<<(k-1);
    for(i=1;i<=k;++i)
    {
        in>>x;
        n+=put*x;
        put=put>>1;
    }
    cn=n; m1=m2=0;
    put=1;
    j=0;
    while(n>9)
    {   put*=10;
        a=n%10;
        ++c;
        b=n/10; b%=10;
        o=10*a+b;
        if(o>m1)
        {   m2=m1;
            m1=o;
            j=c;
        }
        else
            if(o==m1)
            m2=o;
            else
                if(o>m2)
                m2=o;
            /*if(b!=a){
            o=10*b+a;
            if(o>m1)
        {   m2=m1;
            m1=o;
        }
        else
            if(o==m1)
            m2=o;
            else
                if(o>m2)
                m2=o;
    }*/
    n/=10;} n=cn;
    while(n && put>1)
    {
        a=n/put;
        b=n%put; b=b/(put/10);
        o=10*a+b;
        if(!(o==m1 && (m1/10==m1%10))){
        if(o>m1)
        {   m2=m1;
            m1=o;
        }
        else
            if(o==m1)
            m2=o;
            else
                if(o>m2)
                m2=o;}
                n%=put;
                put/=10;
    }
    n=cn;
    n=m1*m2;
    desc(n);
    rez=1;
    for(i=2;i<=99;++i)
    {
        if(n%(i*i)==0)
            rez=i*i;
        if(i*i>=n)
            break;
    }
    out<<rez;
    return 0;
}