Cod sursa(job #3349431)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 29 martie 2026 11:21:08
Problema Pavare2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=105, BAZA=1'000'000'000;
constexpr ll MOD=1'000'000'007;

struct nr
{
	int N;
	int cif[4];

	nr() : N(1)
	{
		memset(cif, 0, sizeof(cif));
	}
	nr(ll x)
	{
		memset(cif, 0, sizeof(cif));
		N=0;
		do
		{
			cif[N++]=x%BAZA;
		}while(x/=BAZA);
	}
	nr(char* s)
	{
		memset(cif, 0, sizeof(cif));

		N=0;
		ll p=1;

		while(*s && *s!='\n')
		{
			cif[N]+=p*(*s-'0');
			p*=10;
			if(p==BAZA)
			{
				p=1;
				++N;
			}
			++s;
		}
		++N;

		while(N>1 && cif[N-1]==0)
			--N;
	}

	nr& operator+=(const nr& o)
	{
		ll t=0;
		for(int i=0;i<4;++i)
		{
			t+=cif[i]+o.cif[i];
			cif[i]=t%BAZA;
			t/=BAZA;
			if(cif[i])
				N=i;
		}
		++N;
		return *this;
	}

	nr& operator-=(const nr& o)
	{
		for(int i=0;i<4;++i)
		{
			cif[i]-=o.cif[i];
			if(cif[i]<0)
			{
				--cif[i+1];
				cif[i]+=BAZA;
			}
			if(cif[i])
				N=i;
		}
		++N;
		return *this;
	}

	friend bool operator<=(const nr& a, const nr& b)
	{
		if(a.N!=b.N)
			return a.N<b.N;
		for(int i=a.N-1;i>-1;--i)
			if(a.cif[i]!=b.cif[i])
				return a.cif[i]<b.cif[i];
		return true;
	}

	void print(FILE* out)
	{
		fprintf(out, "%d", cif[N-1]);
		for(int i=N-2;i>-1;--i)
			fprintf(out, "%09d", cif[i]);
	}
};

int N, lim[2];
char buf[NMAX];
nr K;
nr dp[2][NMAX][NMAX];

int main()
{
	FILE* f=fopen("pavare2.in", "r"), *g=fopen("pavare2.out", "w");
	int i, j, k;

	fscanf(f, "%d%d%d", &N, lim, lim+1);
	fgets(buf, NMAX, f);
	fgets(buf, NMAX, f);
	i=strlen(buf);
	if(buf[i-1]=='\n')
		buf[--i]=0;
	std::reverse(buf, buf+i);
	K=nr(buf);
	// K.print(stdout);

	dp[0][N-1][0].cif[0]=dp[1][N-1][0].cif[0]=1;

	for(i=N-2;i>-1;--i)
		for(k=0;k<2;++k)
		{
			dp[!k][i][0]=dp[k][i+1][lim[k]-1];
			for(j=1;j<lim[k];++j)
			{
				dp[k][i][j]=dp[k][i+1][j-1];
				dp[!k][i][0]+=dp[k][i][j];
			}
		}

	nr total;
	for(k=0;k<2;++k)
		for(i=0;i<lim[k];++i)
			total+=dp[k][0][i];
	total.print(g);
	fprintf(g, "\n");

	int start[2]={lim[0]-1, 0}, end[2]={-1, lim[1]}, step[2]={-1, 1};
	total=nr();
	for(i=0;i<lim[0];++i)
		total+=dp[0][0][i];
	if(K<=total)
		k=0;
	else
	{
		K-=total;
		k=1;
	}

	std::string sol;
	for(i=0;i<N;)
	{
		for(j=start[k];j!=end[k];j+=step[k])
		{
			if(K<=dp[k][i][j])
				break;
			K-=dp[k][i][j];
		}
		while(j>-1)
		{
			sol+='0'+k;
			--j;
			++i;
		}
		k=!k;
	}
	fprintf(g, "%s\n", sol.c_str());

	fclose(f);
	fclose(g);
	return 0;
}