Cod sursa(job #1910368)

Utilizator LucianTLucian Trepteanu LucianT Data 7 martie 2017 16:36:46
Problema Pavare2 Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>
#define maxN 105
#define maxCif 35
using namespace std;
string str;
int dp[maxN][maxN][2][maxCif]; /* total tiles, consec of color,color */
int n,a,b,i,j,x,cnt,last,k[maxCif],sol[maxCif];
void add(int a[],int b[]) /* bignum addition */
{
    int t=0,i;
    for(i=1;i<=a[0] || i<=b[0] || t;i++,t/=10)
        a[i]=(t+=a[i]+b[i])%10;
    a[0]=i-1;
}
void sub(int a[],int b[]) /* bignum subtraction */
{
    int i,t=0;
    for(i=1;i<=a[0];i++)
    {
        a[i]-=((i<=b[0])?b[i]:0)+t;
        a[i]+=(t=(a[i]<0)*10);
    }
    while(!a[a[0]])
        a[a[0]--]=0;
}
bool cmp(int a[],int b[]) /* bignum compare */
{
    if(a[0]!=b[0])
        return a[0]>b[0];
    for(int i=a[0];i>=1;i--)
        if(a[i]!=b[i])
            return a[i]>b[i];
    return false;
}
int main()
{
    ifstream f("pavare2.in");
    ofstream g("pavare2.out");
    f>>n>>a>>b;
    f>>str;
    k[0]=str.length();
    for(i=0;i<(int)str.length();i++)
        k[str.length()-i]=str[i]-'0';

    dp[1][1][0][0]=dp[1][1][0][1]=1; /* initial states */
    dp[1][1][1][0]=dp[1][1][1][1]=1;

    for(i=2;i<=n;i++) /* building dp */
    {
        for(j=1;j<=a;j++)
            add(dp[i][1][1],dp[i-1][j][0]),
            add(dp[i][j][0],dp[i-1][j-1][0]);
        for(j=1;j<=b;j++)
            add(dp[i][1][0],dp[i-1][j][1]),
            add(dp[i][j][1],dp[i-1][j-1][1]);
    }
    for(i=1;i<=n;i++) /* summing */
    {
        for(j=2;j<=a;j++)
            add(dp[i][j][0],dp[i][j-1][0]);
        for(j=2;j<=b;j++)
            add(dp[i][j][1],dp[i][j-1][1]);
    }
    add(sol,dp[n][a][0]);
    add(sol,dp[n][b][1]);
    for(i=sol[0];i>=1;i--)
        g<<sol[i];
    g<<'\n';
    if(cmp(k,dp[n][a][0])==false)
        {g<<0;last=0;cnt=1;}
    else
        {sub(k,dp[n][a][0]);g<<1;last=1;cnt=1;}
    for(i=n-1;i>=1;i--) /* hate this part.. */
    {
        if(last==0 && cnt==a)
            {g<<1;last=1;cnt=1;continue;}
        if(last==1 && cnt==b)
            {g<<0;last=0;cnt=1;continue;}
        if(last==0)
        {
            if(cmp(k,dp[i][a-cnt][0])==false)
                {g<<0;cnt++;}
            else{
                sub(k,dp[i][a-cnt][0]);
                g<<1;
                last=1;cnt=1;
            }
        }
        else
        {
            if(cmp(k,dp[i][a][0])==false)
                {g<<0;last=0;cnt=1;}
            else{
                sub(k,dp[i][a][0]);
                g<<1;
                cnt++;
            }
        }
    }
    return 0;
}