Cod sursa(job #732318)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 10 aprilie 2012 10:59:11
Problema Numere 2 Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.52 kb
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int baza;
class huge 
{
	public: int v[301];
	int i,aux;
	huge() 
	{
		for(i=0;i<=200;i++)
			v[i]=0;
	}
	inline void operator = (huge a)
	{
		memcpy (v,a.v,sizeof (a.v));
	}
	inline void operator = (int a)
	{
		memset(v,0,sizeof(v));
		for ( ;a>0;a=a/10) 
			v[++v[0]]=a%10;
	}
	inline huge operator + (huge &a) const
	{
		huge b; 
		int i,t;
		t=0;
		for(i=1;i<=a.v[0]||i<=v[0]||t;i++,t=t/baza) {
			t=t+a.v[i]+v[i];
			b.v[i]=t%baza;
		}
		b.v[0]=i-1;
		return b;
	}
	inline huge operator - (int a)
	{
		huge b; 
		int i,t;
		t=a;
		memcpy (b.v,v,sizeof (v));
        for (i=1;t;++i,t/=baza) {
            b.v[i]=b.v[i]-(t%baza);
            if(b.v[i]<0) {
				b.v[i+1]--;
				b.v[i]=b.v[i]+baza;
			}
        }
        for ( ;b.v[0]>1 && !b.v[b.v[0]]; b.v[0]--);
        return b;
	}
	inline huge operator * (huge &a) const 
	{
		int i,j,t;
		huge c;
		t=0;
		c.v[0]=a.v[0]+v[0]-1;
		for(i=1;i<=a.v[0]+v[0];i++) 
			c.v[i]=0;
		for(i=1;i<=a.v[0];i++)
			for(j=1;j<=v[0];j++)
				c.v[i+j-1]=c.v[i+j-1]+(1LL*a.v[i]*v[j]);
		for(i=1;i<=c.v[0];i++) { 
			t=(c.v[i]+=t)/baza;
			c.v[i]%=baza;
		}
		if(t) 
			c.v[++c.v[0]]=t;
		return c;
	}
	inline huge operator / (int b) const
	{
		huge a; 
		memcpy (a.v,v,sizeof(v));
		int i,t;
		t=0;
		for (i=a.v[0];i>=1;i--,t=t%b) {
			t=t*baza+a.v[i];
			a.v[i]=t/b;
		}
		for ( ;a.v[0]>1&&!a.v[a.v[0]];a.v[0]--);
		return a;
	}
	inline bool operator < (huge &a)  const 
	{
		int i;
		if(v[0]<a.v[0])
			return true;
		else if(a.v[0]<v[0])
			return false;
		for(i=v[0];i>=1;i--) 
			if(v[i]<a.v[i])
				return true;
			else if(a.v[i]<v[i])
				return false;
		return false;
	}
	inline bool operator == (huge &a) const
	{
		int i;
		if(v[0]!=a.v[0])
			return false;
		for(i=1;i<=v[0];i++)
			if(v[i]!=a.v[i])
				return false;
		return true;
	}
	inline int operator % (int b) const
	{
		int i,t;
		t=0;
		for (i=v[0];i>=1;i--)
              t=(t*10+v[i])%b;
      return t;
	}
	friend ifstream& operator >> (ifstream &f, huge &a)
	{
		int l;
	    char c[301];
		memset(c,0,sizeof(0));
	    f>>c; 
		l=strlen(c)-1;
	    for (int i=l; i>=1; i=i-4) {
	        a.v[++a.v[0]]=c[i]-48;
	        if(i>0) 
				a.v[a.v[0]]=a.v[a.v[0]]+((c[i-1]-48)*10);
	        if(i>1) 
				a.v[a.v[0]]=a.v[a.v[0]]+((c[i-2]-48)*100);
	        if(i>2) 
				a.v[a.v[0]]=a.v[a.v[0]]+((c[i-3]-48)*1000);
	    }
	    return f;
	}
	friend ofstream& operator << (ofstream &g, huge &a)
	{
		int x,i;
		g<<a.v[a.v[0]];
		for (i=a.v[0]-1;i>=1;i--) {
			if (a.v[i]==0) {
				for (x=1;x<baza;x=x*10) 
					g<<"0";
				continue;
			}
			for (x=a.v[i]*10;x<baza;x=x*10) 
				g<<"0";
			g<<a.v[i];
		}
		return g;
	}
};
huge a,pp,mij,aux,d,x;
int i;
inline huge putere (huge A, int E)
{
    huge R; 
	R=1;
    while (E>0)
    {
        if (E&1) R=R*A, --E;
        else {
			A=A*A;
			E>>=1;
		}
        if (pp<A) return A;
        if (pp<R) return R;
    }
    return R;
}
inline int cautarebinara(int b)
{
	huge p,q,s,nr;
	p=2;
	q=pp;
	nr=1;
	while((p<q)||(p==q)) {
		mij=p+q;
		mij=mij/2;
		s=putere(mij,b);
		if(s<pp) 
			p=mij+nr;
		else if(s==pp)
			return 1;
		else q=mij-1;
	}
	return 0;
}
int main ()
{
	int c,b;
	ifstream f("numere2.in");
	ofstream g("numere2.out");
	f>>pp;
	f.close();
	baza=10000;
	for(b=100;b>=1;b--) {
		c=cautarebinara(b);
		if(c) {
			g<<mij<<'\n'<<b;
			break;
		}
	}
	g.close();
	return 0;
}