Cod sursa(job #50556)

Utilizator marius135Dumitran Adrian Marius marius135 Data 7 aprilie 2007 21:17:17
Problema Numere 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define baza 10
long v[102];
long s[102];
long c[102];

void add(long *a)
{
	long i;
	for(i=100;i>=0;i--)
		if(a[i]==baza-1) a[i]=0;
		else {a[i]++;break;}
}

void medie(long *a,long *b,long *c)
{
	long i,rest,t;

	
	for(i=100;i>=0;i--)
		{
		c[i]=a[i]+b[i]+c[i+1]/baza;
		c[i+1]%=baza;
		}
	rest =0;
	for(i=0;i<=100;i++)
		{
		if(c[i]%2==1)  t =5;
		else t =0;
		c[i]=c[i]/2+rest;
		rest = t;
		}
}
long prod(long *a,long *b)
{
	long i,j,cc;
	memset(s,0,sizeof(s));
	for(i=100;i>=0;i--)
		if(a[i])
			for(j=100;j>=1;j--)
				if(b[j])
					{	
					cc = 100 - (100-i) -(100-j);
					if(cc<0) return 0;
					s[cc]+=a[i]*b[j];
					}
	for(i=100;i>=0;i--)
		{
		s[i]+=s[i+1]/baza;
		s[i+1]%=baza;
		a[i+1] = s[i+1];
		if(a[i+1]>10)
			i--;
		}
	if(s[0]) return 0;
	return 1;
}
long ver(long *a,long b)
{
	long i;
	long x[101];
	for(i=0;i<=100;i++) x[i] = a[i];
	
	for(i=2;i<=b;i++) if( prod(x,a)==0) return 1;
	
	for(i=1;i<=100;i++)
		{
		if(x[i] > v[i]) 
			return 1; 
		if(x[i]<v[i]) return -1;}
		
	return 0;
}
void afisare(long *a,long b)
{
	long i;
	
	for(i=1;i<=100;i++)
		if(a[i]) break;
	for(;i<=100;i++) printf("%ld",a[i]);
	printf("\n");
	printf("%ld\n",b);
	exit(0);
}
long cmp(long *a,long *b)
{
	long i;
	for(i=1;i<=100;i++)
		if(a[i] != b[i])  return 1;
		
	return 0;
}
long cauta(long *a,long *b,long putere)
{
	long w;
	long c[102];
	memset(c,0,sizeof(c));
	
	if(cmp(a,b)==0) {if(ver(a,putere)==0) afisare(a,putere);return 0;}
	medie(a,b,c);
	w = ver(c,putere);
	if(w ==0) {afisare(c,putere);}
	if(w > 0 ) return cauta(a,c,putere);
	else 
		{
		add(c);
		return cauta(c,b,putere);
		}
	
}

int main()
{
	long x[102],y[102];
	long i,n;
	char cc[102];
	freopen("numere2.in","r",stdin);
	freopen("numere2.out","w",stdout);
	scanf("%s",cc);
	n = strlen(cc);
	memset(v,0,sizeof(v));
	for(i=100;i>=100- n+1;i--)
		v[i] = cc[n+ i-100 - 1]-'0';
	
	
	for(i=355;i>=1;i--)
		{
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		x[100] = 2;
		if(ver(x,i)>0) continue;
		x[100] = 1;
		y[1] =1;
		cauta(x,y,i);
	    }
	
	return 0;
}