Cod sursa(job #134149)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 10 februarie 2008 19:19:32
Problema Expresii 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include<stdio.h>
long int n,k,i,j,poz,nv,ll;
long long int p,s[35][35],sol;
char sc[35],uc;
long long int ss(long int le,long int lp);
void numar();
int main()
{
	FILE *f,*g;f=fopen("expresii2.in","r");g=fopen("expresii2.out","w");
	fscanf(f,"%ld%ld%lld",&n,&k,&p);
	s[0][0]=0;
	s[1][1]=0;
	s[1][0]=k;
	s[2][2]=0;
	s[2][1]=1;
	s[2][0]=k;
	s[3][3]=0;
	s[3][2]=2;
	s[3][1]=2*k+1;
	s[3][0]=k*s[3][1];
	for(i=4;i<=n;i++)
	{ s[i][i]=0;
	  for(j=i-1;j>1;j--)
	   s[i][j]=k*s[i][j+1]+2*s[i-2][j-1]+s[i-1][j];
	  s[i][1]=k*s[i][2]+s[i-1][1];
	  s[i][0]=k*s[i][1];
	}
	sol=s[n][0];
	fprintf(g,"%lld\n",sol);
	uc='A';for(i=1;i<k;i++)uc++;
	sc[poz]='A';while(p>s[n][1]){sc[poz]++;p=p-s[n][1];}poz++;
	nv=1;ll=n;
	numar();
	fprintf(g,"%s\n",sc);
	fcloseall();
	return 0;
}
void numar()
{
  if(poz==n)return;
  if(poz==n-1)
  { if(nv==1){sc[poz]='!';poz++;numar();return;}
    if(p==1){sc[poz]='+';poz++;numar();return;}
    sc[poz]='*';poz++;numar();return;
  }
  if(nv==1){
	     sc[poz]='A';nv++;
	     while((sc[poz]<=uc)&&(s[ll][nv]<p))
	     { p-=s[ll][nv];
	       sc[poz]++;
	     }
	     if(sc[poz]<=uc){poz++;numar();if(poz==n)return;}
	     else { sc[poz]='!';poz++;ll--;nv--;numar();if(poz==n)return;}
	   }
  sc[poz]='A';nv++;
  while((sc[poz]<=uc)&&(s[ll][nv]<p))
   { p-=s[ll][nv];sc[poz]++;}
  if(sc[poz]<=uc){poz++;numar();if(poz==n)return;}
  else
  { nv--;
    sc[poz]='+';nv--;ll-=2;
    if(s[ll][nv]<p){sc[poz]='*';p-=s[ll][nv];}
    if(s[ll][nv]<p){sc[poz]='!';p-=s[ll][nv];nv++;ll++;poz++;numar();if(poz==n)return;}
    poz++;numar();
  }
}
// 1 AA +!
// 2 AA *!
// 3 AA !+
// 4 AA !*
// 5 A B+!
// 6 A B*!
// 7 A B!+
// 8 A B!*
// 9 A !A+
//10 A !A*
//11 A !B+
//12 A !B*
//13 A !!!
//14 BA+!
//15 BA*!
//16 BA!+
//17 BA!*
//18 BB+!
//19 BB*!
//20 BB!+
//21 BB!*
//22 B!A +
//23 B!A *
//24 B!B +
//25 B!B *
//26 B!!!

//A A+
//A A*
//A B+
//A B*
//A !!
//BA+
//BA*
//BB+
//BB*
//B!!
//s[3][3]=0;
//s[3][2]=2;
//s[3][1]=5
//s[3][0]=10
//A!
//B!