Cod sursa(job #2516519)

Utilizator betybety bety bety Data 31 decembrie 2019 21:49:37
Problema Pavare2 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 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];
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;
}
int main()
{
    ios_base::sync_with_stdio(false);
    in.tie(0),out.tie(0);
    int n,a,b,k;
    in>>n>>a>>b>>k;
    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==1)
    {
        for(int i=1;i<=n;++i)
        if(i%(a+1)==0)
        out<<1;
        else out<<0;
        return 0;
    }
    return 0;
}