Cod sursa(job #2323531)

Utilizator mihaimodiMihai Modi mihaimodi Data 19 ianuarie 2019 12:00:57
Problema Pavare2 Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("pavare2.in");
ofstream fout("pavare2.out");
int a[105][105][105],b[105][105][105],nrOrd[105],s[105];
int n,ma,mb,x;
bool stare;
char c[105];
void suma(int v1[],int v2[],int v3[])
{
	int t=0;
	int nrcif=max(v1[0],v2[0]);
	v3[0]=nrcif;
	for(int i=1;i<=nrcif;i++)
	{
	    t+=v1[i]+v2[i];
	    v3[i]=t%10;
	    t/=10;
	}
	if(t)
    {
        v3[0]++;
        v3[v3[0]]=t;
    }
}
void dif(int v1[],int v2[],int v3[])
{
    int t=0;
    for(int i=1;i<=v1[0];i++)
    {
        t+=v1[i]-v2[i];
        v3[i]=t%10;
        t/=10;
    }
    while(!v3[0])
        v3[0]--;
}
int cmp(int v1[],int v2[])
{
    for(int i=0;i<=max(v1[0],v2[0]);i++)
    {
        if(v1[i]>v2[i])
            return 1;
        else if(v1[i]<v2[i])
            return -1;
    }
    return 0;
}
int main()
{
    fin>>n>>ma>>mb>>(c+1);
    nrOrd[0]=strlen(c+1);
    for(int i=1;i<=nrOrd[0];i++)
        nrOrd[i]=c[i]-'0';
    a[0][0][1]=a[0][0][0]=b[0][0][1]=b[0][0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=ma&&j<=i;j++)
        {
            for(int k=0;k<=b[i-j][0][0];k++)
                a[i][j][k]=b[i-j][0][k];
            suma(a[i][0],a[i][j],a[i][0]);
        }
        for(int j=1;j<=mb&&j<=i;j++)
        {
            for(int k=0;k<=a[i-j][0][0];k++)
                b[i][j][k]=a[i-j][0][k];
            suma(b[i][0],b[i][j],b[i][0]);
        }
    }
    suma(a[n][0],b[n][0],s);
    for(int i=s[0];i>=1;i--)
        fout<<s[i];
    fout<<'\n';
    stare=0;
    x=n;
    while(x)
    {
        if(stare==0)
        {
            if(cmp(nrOrd,a[x][0])==1)
                dif(nrOrd,a[x][0],nrOrd);
            else
            {
                  int j;
                  for(j=ma;cmp(nrOrd,a[x][j])==1&&j>=1;j--)
                          dif(nrOrd,a[x][j],nrOrd);

                  if(j>=1)
                  {
                        for(int l=1;l<=j;l++)
                              fout<<0;
                        x-=j;
                  }
            }
        }
        else
        {
            if(cmp(nrOrd,b[x][0])==1)
                dif(nrOrd,b[x][0],nrOrd);
            else
            {
                  int j;
                  for(j=1;cmp(nrOrd,b[x][j])==1&&j<=mb;j++)
                          dif(nrOrd,b[x][j],nrOrd);

                  if(j>=1)
                  {
                        for(int l=1;l<=j;l++)
                              fout<<1;
                        x-=j;
                  }
            }
        }
        stare=!stare;
    }
    return 0;
}