Cod sursa(job #2926506)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 17 octombrie 2022 21:20:51
Problema Pavare2 Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC

using namespace std;
long long dp[101][2];
int sir[101];
int main()
{
    int i, n, a, b, j;
    long long k, suma, sumb, sum;
    freopen("pavare2.in","r",stdin);
    freopen("pavare2.out","w",stdout);
    scanf("%d%d%d%lld", &n, &a, &b, &k);
    dp[0][0] = dp[0][1] = 1;
    suma = 1;
    sumb = 1;
    for(i = 1; i <= n; i++)
    {
        if(i >= a + 1) suma -= dp[i - a - 1][1];
        if(i >= b + 1) sumb -= dp[i - b - 1][0];
        dp[i][0] = suma;
        dp[i][1] = sumb;
        suma += dp[i][1];
        sumb += dp[i][0];
    }
    printf("%lld\n", dp[n][0] + dp[n][1]);
    if(k > dp[n][0]) sir[n] = 1, k -= dp[n][0];
    else sir[n] = 0;
    for(i = n; i > 1;)
    {
        if(sir[i] == 1)
        {
            sum = 0;
            for(j = i - 1; j > i - b - 1 && j >= 0; sum += dp[j][0], j--)
                if(sum + dp[j][0] >= k)
                    break;
            while(i > j)
                sir[i--] = 1;
            sir[j] = 0;
            k -= sum;
        }
        else
        {
            sum = 0;
            for(j = max(i - a, 0); j < i; sum += dp[j][1], j++)
                if(sum + dp[j][1] >= k)
                    break;
            while(i > j)
                sir[i--] = 0;
            sir[j] = 1;
            k -= sum;
        }
    }
    for(i = 1; i <= n; i++)
        printf("%d", sir[i]);

    return 0;
}