Cod sursa(job #433580)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 3 aprilie 2010 21:34:34
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<stdio.h>
FILE*f=fopen("gfact.in","r");
FILE*g=fopen("gfact.out","w");
int z,aux,j,a[2][7000],k,p[5500],i,q,m,min,max,b[7000],t,s,mij;
char v[50001];
int main () {
	fscanf(f,"%d %d",&m,&q);
	for(i=2;i<=50000;i++){
		if(v[i]==0){
			p[++k]=i;
			for(j=i+i;j<=50000;j++)
				v[j]=1;
		}
	}
	aux=m;
	for(i=1;p[i]<=m;i++){
		if(aux%p[i]==0)
			a[0][++z]=p[i];
			while(aux%p[i]==0){
				a[1][z]++;
				aux/=p[i];
			}
			a[1][z]*=q;
	}
	if(aux!=1){
		a[0][++z]=aux;
		a[1][z]=q;
	}
	for(i=1;i<=z;i++){
		// cautam binar cea mai mica valoare x! care se divide cu a[0][i]^a[1][i]
		min = 1; max = 2*a[0][i]*a[1][i]*q;
		while(min<=max){
			mij = min + (max - min)/2;
			s=0;
			t=1;
			while(t<mij){
				t*=2;
				s+=mij/t;
			}
			if(s>=a[1][i])
				//caut in stanga
				max =  mij - 1;
			else
				//caut in dreapta
				min = mij + 1;
		}
		b[i]=min;
	}
	max=0;
	for(i=1;i<=z;i++)
		if(b[i]>max)
			max=b[i];
	fprintf(g,"%d",max);
	fclose(f);
	fclose(g);
	return 0;
}