Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Rating Ursu Vlad-Andrei (vlad_andrei.ursu) | Cod sursa (job #2719964)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("expresii2.in");
ofstream fout("expresii2.out");
typedef long long ll;
ll dp[35][35][35], n, m, p;
int sol[105], y;
int main()
{
fin >> n >> m >> p;
dp[0][1][0] = 1;
for(int i = 0; i < n; ++i)
for(int j = 0; j <= n; ++j)
for(int k = 0; k < m + 3; ++k)
if(dp[i][j][k] > 0)
{
if(i + j + 1 <= n)
dp[i + 1][j][m + 2] += dp[i][j][k];
if(i + j + 2 <= n)
dp[i + 1][j + 1][m] += dp[i][j][k],
dp[i + 1][j + 1][m + 1] += dp[i][j][k];
if(j > 1 || (j == 1 && i == n - 1))
for(int lit = 0; lit < m; ++lit)
dp[i + 1][j - 1][lit] += dp[i][j][k];
}
ll rez = 0;
for(int j = 0; j < m + 2; ++j)
rez += dp[n][0][j];
fout << rez << '\n';
for(int i = n; i >= 1; --i)
for(int j = 0; j < m + 3; ++j)
if(dp[i][y][j] < p)
p -= dp[i][y][j];
else {
sol[n - i + 1] = j;
if(j < m)
++y;
else y -= (j < m + 2);
break;
}
for(int i = 1; i <= n; ++i)
if(sol[i] < m)
fout << (char)(sol[i] + 'A');
else if(sol[i] == m)
fout << "+";
else if(sol[i] == m + 1)
fout << "*";
else fout << "!";
return 0;
}