Cod sursa(job #1741274)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 13 august 2016 15:10:41
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
#include<cstring>
#define MOD 30103
#define MAXN 210
#define DIGITS 12
using namespace std;
char s[MAXN];
int first[DIGITS][MAXN],dp[2][MAXN][MAXN];
int main(){
    freopen("diviz.in","r",stdin);
    freopen("diviz.out","w",stdout);
    int k,a,b,n,i,j,l,m,p=1,q=0,answer=0;
    scanf("%d%d%d\n%s",&k,&a,&b,s+1);
    n=strlen(s+1);
    for(i=n;i>=1;i--)
        for(j=0;j<=9;j++)
            if(j==s[i]-'0')
                first[j][i]=i;
            else
                first[j][i]=first[j][i+1];
    for(i=1;i<=9;i++)
        dp[1][first[i][1]][i%k]=1;
    for(i=1;i<=b;i++){
        p^=1;
        q^=1;
        memset(dp[p],0,sizeof(dp[p]));
        for(j=i;j<=n;j++){
            if(i>=a){
                answer+=dp[q][j][0];
                if(answer>=MOD)
                    answer-=MOD;
            }
            for(l=0;l<k;l++)
                if(dp[q][j][l]!=0)
                    for(m=0;m<=9;m++)
                        if(first[m][j+1]!=0)
                            dp[p][first[m][j+1]][(l*10+m)%k]=(dp[p][first[m][j+1]][(l*10+m)%k]+dp[q][j][l])%MOD;
        }
    }
    printf("%d",answer);
    return 0;
}