Cod sursa(job #2516521)

Utilizator betybety bety bety Data 31 decembrie 2019 23:04:32
Problema Pavare2 Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.12 kb
#include <fstream>
using namespace std;
ifstream in("pavare2.in");
ofstream out("pavare2.out");
const int lim=105;
struct numar
{
    int v[45];
}dp[lim][2*lim];
int alb[45];
int negru[45];
int rez[45];
int k[45];
inline void afis(int v[])
{
    for(int i=v[0];i>=1;--i)
        out<<v[i];
    out<<'\n';
}
inline void cpy(int v[],int f[])
{
    for(int i=v[0];i>=0;--i)
        v[i]=0;
    for(int i=f[0];i>=0;--i)
        v[i]=f[i];
}
inline void adun(int a[],int b[],int sum[])
{
    int aux,carry=0;
    for(int i=1;i<=max(a[0],b[0]);++i)
    {
        aux=a[i]+b[i]+carry;
        sum[i]=aux%10;
        carry=aux/10;
    }
    sum[0]=max(a[0],b[0]);
    if(carry!=0)
        sum[0]++,sum[sum[0]]=carry;
    for(int i=sum[0]+1;i<=44;++i)
        sum[i]=0;
}
inline void makezero(int v[])
{
    for(int i=0;i<=44;++i)
        v[i]=0;
}
inline bool compar(int v[],int f[])
{
    if(v[0]<f[0])
        return 1;
    if(v[0]>f[0])
        return 0;
    for(int i=1;i<=v[0];i++)
        if(v[i]<f[i])
        return 1;
    return 0;
}
inline void scad(int a[],int b[],int c[])
{
    int aux,carry=0;
    for(int i=1;i<=a[0];++i)
    {
        aux=a[i]-carry-b[i];
        if(aux<0)
            c[i]=aux+10,carry=1;
        else c[i]=aux,carry=0;
    }
    c[0]=a[0];
    if(c[c[0]]==0)
        --c[0];
}
int main()
{
    ios_base::sync_with_stdio(false);
    in.tie(0),out.tie(0);
    int n,a,b;
    in>>n>>a>>b;
    char ch;
    while(in>>ch)
        k[++k[0]]=ch-'0';
    dp[1][1].v[0]=dp[1][1].v[1]=1;
    dp[1][a+1].v[0]=dp[1][a+1].v[1]=1;
    for(int i=2;i<=n;++i)
    {
        makezero(alb);
        makezero(negru);
        for(int j=1;j<=a;++j)
            adun(alb,dp[i-1][j].v,alb);
        for(int j=a+1;j<=a+b;++j)
            adun(negru,dp[i-1][j].v,negru);
        for(int j=2;j<=a;++j)
            cpy(dp[i][j].v,dp[i-1][j-1].v);
        cpy(dp[i][1].v,negru);
        for(int j=a+2;j<=a+b;++j)
            cpy(dp[i][j].v,dp[i-1][j-1].v);
        cpy(dp[i][a+1].v,alb);
    }
    for(int i=1;i<=a+b;++i)
        adun(rez,dp[n][i].v,rez);
    afis(rez);
    if(k[0]==1 and k[1]==1)
    {
        for(int i=1;i<=n;++i)
        if(i%(a+1)==0)
        out<<1;
        else out<<0;
        return 0;
    }
    string pavare="";
    int lastalbe=0,lastnegre=0;
    for(int i=1;i<=n;++i)
    {
        makezero(rez);
        if((0<lastnegre and lastnegre<=b-1) or (lastnegre==0 and lastalbe<=a-1))
        {
            lastalbe++;
            for(int j=1;j<=a-lastalbe;++j)
                adun(rez,dp[n-i][j].v,rez);
            for(int j=a+1;j<=a+b;++j)
                adun(rez,dp[n-i][j].v,rez);
            if(compar(rez,k)==1)
                pavare+='1',lastnegre=1,lastalbe=0,scad(k,rez,k);
            else pavare+='0';
        }
        else if(lastnegre==0 and lastalbe==a)
        {
            pavare+='1';
            lastnegre=1;
            lastalbe=0;
        }
        else if(lastnegre==b)
        {
            pavare+='0';
            lastnegre=0;
            lastalbe=1;
        }
    }
    out<<pavare;
    return 0;
}