Cod sursa(job #73544)

Utilizator moga_florianFlorian MOGA moga_florian Data 19 iulie 2007 14:33:07
Problema Pavare2 Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.37 kb
using namespace std;
#include<fstream>
#include<stdio.h>
#include<string.h>
#define Nmax 105
#define Lmax 50
#define base 10000

int CA[Nmax][Nmax][Lmax],CN[Nmax][Nmax][Lmax];
int LA[Nmax][Nmax],LN[Nmax][Nmax];
int crt[Lmax],Ncrt;
int K[Lmax],NK;
char s[Lmax];

int comp(int a[],int na)
{
if(na>NK) return 1;
if(na<NK) return -1;

int i=NK;
while(i && a[i] == K[i]) i--;

if(i==0) return 0;
if(a[i] > K[i]) return 1;
return -1;  
}

int comp2(int a[], int na)
{
int b[Lmax],nb;
memset(b,0,sizeof b);
int i,t;

for(i=1,t=0; i<=na || i<=Ncrt || t; i++, t/=base)
     b[i] = (t+= a[i] + crt[i]) % base;
nb= i-1;

return comp(b,nb);    
}

int main()
{
ifstream fin("pavare2.in");
FILE *fout=fopen("pavare2.out","w");
     
int N,A,B,i,j,k,t;

fin>>N>>A>>B>>s;

for(i=0;s[i];i++);
i--;
for(j=0;j<i;i--,j++)
  {
  char aux=s[i];
  s[i]=s[j];
  s[j]=aux;
  }

NK=0;
for(i=0;s[i];i+=4)
  {
  K[++NK] = s[i] - '0';
  if(s[i+1]) K[NK]+= 10 * (s[i+1]-'0');
  if(s[i+2]) K[NK]+= 100 * (s[i+2]-'0');
  if(s[i+3]) K[NK]+= 1000 * (s[i+3]-'0');  
  }

for(i=1;i<=N+1;i++)
  {
  for(j=0;j<=N+1;j++) LA[i][j]=1;
  for(j=0;j<=N+1;j++) LN[i][j]=1;               
  }

CA[N][1][1]=1;
CN[N][1][1]=1;

for(i=N;i;i--)
  {
  //alb
  for(j=2;j<=A;j++)
     {
     LA[i][j]=LA[i+1][j-1];
     memcpy(CA[i][j], CA[i+1][j-1], sizeof CA[i][j]);
     }
  for(j=1;j<=B;j++)
     {
     for(k=1,t=0; k<=LA[i][1] || k<=LN[i+1][j] || t; k++, t/=base)
         CA[i][1][k] = (t+= CA[i][1][k] + CN[i+1][j][k]) %base;
     LA[i][1]=k-1;
     }
  
  //negru
  for(j=2;j<=B;j++)
     {
     LN[i][j] = LN[i+1][j-1];
     memcpy(CN[i][j], CN[i+1][j-1], sizeof CN[i][j]);
     }
  for(j=1;j<=A;j++)
     {
     for(k=1,t=0;k<=LN[i][1] || k<=LN[i+1][j] || t; k++, t/=base)
         CN[i][1][k] = (t+= CN[i][1][k] + CA[i+1][j][k]) %base;
     LN[i][1] = k-1;
     }
  }
  
for(j=A-1;j;j--)
 {
 for(k=1,t=0; k<=LA[1][j] || k<=LA[1][j+1] || t; k++, t/=base)
     CA[1][j][k] = (t+= CA[1][j][k] + CA[1][j+1][k]) % base;
 LA[1][j] = k-1;
 }
 
LN[1][0]=LA[1][1];
memcpy(CN[1][0], CA[1][1], sizeof CN[1][0]);

for(j=1;j<=B;j++)
  {
  for(k=1, t=0; k<=LN[1][j] || k<=LN[1][j-1] || t; k++, t/=base)
    CN[1][j][k] = (t+= CN[1][j][k] + CN[1][j-1][k]) % base;          
  LN[1][j] = k-1;
  }


for(i=2;i<=N;i++)
  {
  for(j=A-1;j;j--) 
    {
    for(k=1,t=0; k<=LA[i][j] || k<=LA[i][j+1] || t; k++, t/=base)
         CA[i][j][k] = (t+= CA[i][j][k] + CA[i][j+1][k]) % base;               
    LA[i][j] = k-1;
    }
  
  for(j=2;j<=B;j++) 
    {
    for(k=1,t=0; k<=LN[i][j] || k<=LN[i][j-1] || t; k++,t/=base)
       CN[i][j][k] = (t+= CN[i][j][k] + CN[i][j-1][k]) % base;                
    LN[i][j] = k-1;
    }
  }
  
fprintf(fout,"%d",CN[1][B][ LN[1][B] ]);
for(i=LN[1][B]-1 ; i; i--)
   fprintf(fout,"%04d",CN[1][B][i]);
fprintf(fout,"\n");

if(NK==1 && K[1]==1)
{
int sol[200];
for(i=1;i<=N;i++)
  {
  for(j=i;j<i+A;j++)
     sol[j]=0;
  sol[j]=1;
  i=j;               
  }     
  
for(i=1;i<=N;i++)
  fprintf(fout,"%d",sol[i]);
}
else
{

//prima valoare
int ult;

i=1;
  for(j=A;j;j--)
     if(comp(CA[i][j],LA[i][j]) >= 0)
       break;
       
  if(j == 0)
    {
    for(j=1;j<=B;j++)
       if(comp(CN[i][j],LN[i][j]) >= 0)
          break;      
          
    for(k=1;k<=j;k++)
      fprintf(fout,"1"); 
    ult=1;
    Ncrt=LN[i][j-1];
    memcpy(crt, CN[i][j-1], sizeof crt);
    i+=j;    
    }      
  else
    {
    for(k=1;k<=j;k++)
      fprintf(fout,"0");
    ult=0;
    Ncrt=LA[i][j+1];
    memcpy(crt, CA[i][j+1], sizeof crt);
    i+=j;              
    }


for(;i<=N;i++)
  if(ult)
   {//caut alb
    for(j=A;j;j--)
      if(comp2(CA[i][j],LA[i][j]) >= 0)
         break;
         
    for(k=1;k<=j;k++) fprintf(fout,"0");
    
    for(k=1,t=0; k<=LA[i][j+1] || k<=Ncrt || t; k++, t/=base)
        crt[k] = (t+=crt[k] + CA[i][j+1][k]) % base;
    Ncrt= k-1;
    
    i+=j-1;
    ult=0;
   }    
  else
   {//caut negru
    for(j=1;j<=B;j++)
      if(comp2(CN[i][j],LN[i][j]) >= 0)
        break;
        
    for(k=1;k<=j;k++) fprintf(fout,"1");
    for(k=1,t=0; k<=LN[i][j-1] || k<=Ncrt||t; k++, t/=base)
        crt[k] = (t+=crt[k] + CN[i][j-1][k]) % base;
    Ncrt= k-1;
    
    i+=j-1;
    ult=1;
   }

}  
fprintf(fout,"\n");


fin.close();
fclose(fout);
return 0;
}