Cod sursa(job #1617358)

Utilizator ZenusTudor Costin Razvan Zenus Data 27 februarie 2016 13:05:01
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 100009;
const int kmax = 109;
const int mod = 30211;

int d[nmax][kmax][2];
int n , k , i , j , t;
char s[nmax];

int main()
{
freopen("carry.in" , "r" , stdin);
freopen("carry.out" , "w" , stdout);

scanf("%d" , &n);
scanf("%d\n" , &k);

gets(s + 1);

for (i = 1 ; i <= n / 2 ; ++i)
swap(s[i] , s[n - i + 1]);

t = s[1] - '0';
d[1][0][0] = 10 - t;
d[1][0][1] = t;

for (i = 2 ; i <= n ; ++i)
{
    t = s[i] - '0';
    for (j = 0 ; j <= i ; ++j)
    {
        d[i][j][0] += d[i - 1][j][0] * (10 - t);
        d[i][j][0] %= mod;

        d[i][j][1] += d[i - 1][j][0] * t;
        d[i][j][1] %= mod;

        if (1 <= j)
        {
            d[i][j][0] += d[i - 1][j - 1][1] * (10 - t - 1);
            d[i][j][0] %= mod;

            d[i][j][1] += d[i - 1][j - 1][1] * (t + 1);
            d[i][j][1] %= mod;
        }
    }
}

d[n][k][0] += d[n][k - 1][1];
d[n][k][0] %= mod;

printf("%d\n" , d[n][k][0]);

return 0;
}