Cod sursa(job #2225417)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 26 iulie 2018 23:40:23
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
#define N 205
#define K 105
#define MOD 30103

using namespace std;

ifstream fin("diviz.in") ;
ofstream fout("diviz.out") ;

int dp[N][K][N] , first[15][N] ;
string sir ;
int main()
{
    int k , a , b , n , i , j , ii , cf , sol = 0 ;
    fin >> k >> a >> b ;
    fin >> sir ;
    sir = "0"+sir ;
    n = sir.size()-1 ;
    for ( i = n ; i >= 1 ; i-- )
    {
        for ( j = 0 ; j <= 9 ; j++ )
        {
            if ( j == sir[i] - '0' )
                first[j][i] = i ;
            else
                first[j][i] = first[j][i+1] ;
        }
    }
    for ( i = 1 ; i <= 9 ; i++ )
        dp[1][i%k][first[i][1]] = 1 ;
    for ( i = 1 ; i <= n ; i++ )
    {
        for ( j = 0 ; j < k ; j++ )
        {
            for ( ii = 1 ; ii <= n ; ii++ )
            {
                for ( cf = 0 ; cf <= 9 ; cf++ )
                {
                    if ( first[cf][ii+1] != 0 )
                        dp[i+1][(j*10+cf)%k][first[cf][ii+1]] = (dp[i][j][ii] + dp[i+1][(j*10+cf)%k][first[cf][ii+1]] )%MOD ;
                    if ( i >= a-1 && i < b && first[cf][ii+1] != 0 && (j*10+cf)%k == 0 )
                        sol = ( dp[i+1][(j*10+cf)%k][first[cf][ii+1]] + sol ) % MOD ;
                }
            }
        }
    }
    /*for ( i = 1 ; i <= n ; i++ )
    {
        for ( j = 0 ; j < k ; j++ )
        {
            for ( ii = 1 ; ii <= n ; ii++ )
            {
                cout << "dp[" << i << "][" << j << "][" << ii << "]  " << dp[i][j][ii] << endl ;
            }
        }
    }*/
    fout << sol ;
}