Cod sursa(job #133826)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 februarie 2008 20:28:54
Problema Expresii 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
#include<string.h>
long int n,k,j,jj,ok;
long long int p,ne,ee[35],sol,step;
char sc[35],sf[35],al[35],c;
void prel(long int cr,long int ec);
int main()
{
	FILE *f,*g;f=fopen("expresii2.in","r");g=fopen("expresii2.out","w");
	fscanf(f,"%ld%ld%lld",&n,&k,&p);
	c='A';al[0]=c;
	ee[1]=k;ee[2]=k;
	for(j=3;j<=n;j++)
	{ ee[j]=ee[j-1];
	  for(jj=1;jj<=j-2;jj++)
	   ee[j]=ee[j]+2*ee[jj]*ee[j-jj-1];
	}
	sol=ee[n];step=sol/k;
	ne=0;jj=1;
	for(;;){if(ne+step>p)break;jj++;ne+=step;}
	for(j=1;j<=30;j++)al[j]=c++;
	sc[0]=al[jj];prel(n-1,1);
	fprintf(g,"%lld\n",sol);
	fprintf(g,"%s\n",sc);
	fcloseall();
	return 0;
}
void prel(long int cr,long int ec)
{       long int i;
	if(!cr){ne++;if(ne==p)ok=1;return;}
	if(cr>=ec+1)
	{ for(i=1;i<=k;i++){sc[n-cr]=al[i];prel(cr-1,ec+1);if(ok)return;}
	  if(ec>1){sc[n-cr]='+';prel(cr-1,ec-1);if(ok)return;
		   sc[n-cr]='*';prel(cr-1,ec-1);if(ok)return;}
	  sc[n-cr]='!';prel(cr-1,ec);if(ok)return;
	  return;
	}
	if(cr==ec)
	{ if(ec>1){sc[n-cr]='+';prel(cr-1,ec-1);if(ok)return;
		   sc[n-cr]='*';prel(cr-1,ec-1);if(ok)return;}
	  sc[n-cr]='!';prel(cr-1,ec);if(ok)return;
	  return;
	}
	if(ec>1){sc[n-cr]='+';prel(cr-1,ec-1);if(ok)return;
	         sc[n-cr]='*';prel(cr-1,ec-1);if(ok)return;}
}