Pagini recente » Cod sursa (job #152404) | Cod sursa (job #2931635) | Cod sursa (job #1384870) | Cod sursa (job #269899) | Cod sursa (job #1330870)
#include <cstdio>
#include <vector>
#define Nmax 105
using namespace std;
int N,A,B,K;
long long DPA[Nmax][Nmax],DPN[Nmax][Nmax];
/// DPA[i][j] in cate feluri putem pava i pietre primele j fiind albe
/// DPN[i][j] in cate feluri putem pava i pietre primele j fiind negre
vector<int> sol;
void Read(){
scanf("%d%d%d%d",&N,&A,&B,&K);
}
void Solve(){
DPA[1][1] = 1;
DPN[1][1] = 1;
for(int i = 2; i <= N; ++i)
{
for(int k = 1; k <= B && k < i; ++k)
DPA[i][1] = DPA[i][1] + DPN[i-1][k]; /// schimb culoarea
for(int k = 1; k <= A && k < i; ++k)
DPN[i][1] = DPN[i][1] + DPA[i-1][k]; /// schimb culoarea
for(int j = 2; j <= A && j <= i; ++j)
DPA[i][j] = DPA[i-1][j-1]; /// prelungire
for(int j = 2; j <= B && j <= i; ++j)
DPN[i][j] = DPN[i-1][j-1]; /// prelungire
}
long long ans = 0;
for(int i = 1; i <= A; ++i)
ans += DPA[N][i];
for(int i = 1; i <= B; ++i)
ans += DPN[N][i];
printf("%lld\n",ans);
}
void Print( long long a[Nmax][Nmax] )
{
for(int i = 1; i <= N; ++i)
{
for(int j = 1; j <= N; ++j)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n-------------------------\n");
}
void Debug()
{
Print(DPA);
Print(DPN);
}
void Reconst()
{
int lastA = 0,lastB = 0;
long long crt = 0,gata;
int tip = 0;
for(int pz = N; pz >= 1; --pz)
{
gata = 0;
if(tip == 0)
{
for(int j = A; j >= 1; --j) /// incerc sa pun cati mai multi de 0
if(K > DPA[pz][j])
K -= DPA[pz][j];
else
{
for(int k = 1; k <= j; ++k)
sol.push_back(0);
gata = 1;
pz -= (j - 1);
tip = 1;
break;
}
}
if(tip == 1 || !gata)
{
if(gata)
continue;
for(int j = 1; j <= B; ++j)
if(K > DPN[pz][j])
K -= DPN[pz][j];
else
{
for(int k = 1; k <= j; ++k)
sol.push_back(1);
pz -= (j - 1);
tip = 0;
break;
}
}
}
for(int i = 0; i < N; ++i)
printf("%d",sol[i]);
printf("\n");
}
int main()
{
freopen("pavare2.in","r",stdin);
freopen("pavare2.out","w",stdout);
Read();
Solve();
///Debug();
Reconst();
return 0;
}