Cod sursa(job #1244242)

Utilizator enedumitruene dumitru enedumitru Data 16 octombrie 2014 22:39:52
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("pavare2.in"); ofstream g("pavare2.out");
int n,A,B,K[35];
int alb[110][110][35], neg[110][110][35], sol[35];
inline void Add(int A[], int B[])
{   int i,t=0;
    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;
}
inline void Scad(int A[], int B[])
{   int i,t=0;
    for(i=1;i<=A[0];++i)
    {   if(i<=B[0]) A[i]=A[i]-B[i]-t; else A[i]=A[i]-t;
        if(A[i]<0) {t=1; A[i]+=10;} else t=0;
    }
    while(A[0]>1 && A[A[0]]==0) A[0]--;
}
inline int Compara(int A[], int B[])
{	if(A[0]<B[0]) return -1;
    if(A[0]>B[0]) return 1;
    for(int i=A[0];i;--i)
    {	if(A[i]<B[i]) return -1;
        if(A[i]>B[i]) return 1;
    }
    return 0;
}
int main()
{   int i,j,lim,ns,last,nr;
    char s[35];
    f>>n>>A>>B;
    f>>(s+1);
    ns=strlen(s+1);
    for(i=1;i<=ns;++i) K[i]=s[ns-i+1]-'0';
    K[0]=ns;
    for(i=1;i<=A;++i) alb[n+1][i][0]=alb[n+1][i][1]=1;
    for(i=1;i<=B;++i) neg[n+1][i][0]=neg[n+1][i][1]=1;
    for(i=n;i;--i)
    {   lim=min(n,i+A-1);
        for(j=i;j<=lim;++j) Add(alb[i][j-i+1],neg[j+1][B]);
        for(j=2;j<=A;++j)   Add(alb[i][j],alb[i][j-1]);
        lim=min(n,i+B-1);
        for(j=i;j<=lim;++j) Add(neg[i][j-i+1],alb[j+1][A]);
        for(j=2;j<=B;++j)   Add(neg[i][j],neg[i][j-1]);
    }
    Add(sol,alb[1][A]); Add(sol,neg[1][B]);
    for(i=sol[0];i;--i) g<<sol[i];
    g<<"\n";
    if(Compara(K,alb[1][A])<=0) {g<<"0"; last=0; nr=1;} else {Scad(K,alb[1][A]); g<<"1"; last=nr=1;}
    for(i=2;i<=n;++i)
    {   if(last==0 && nr==A) {g<<"1"; last=nr=1; continue;}
        if(last==1 && nr==B) {g<<"0"; last=0; nr=1; continue;}
        if(last==0)
        {   if(Compara(K,alb[i][A-nr])<=0) {g<<"0"; nr++;}
            else {Scad(K,alb[i][A-nr]); g<<"1"; last=nr=1;}
        }
        else
        {   if(Compara(K,alb[i][A])<=0) {g<<"0"; last = 0; nr = 1;}
            else {Scad(K, alb[i][A]); g<<"1"; nr++;}
        }
    }
    g<<"\n"; g.close(); return 0;
}