Pagini recente » Cod sursa (job #3314155) | Cod sursa (job #3342843) | Cod sursa (job #1606759) | Cod sursa (job #2546497) | Cod sursa (job #3349430)
// 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);
K=nr(buf);
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;
}