Cod sursa(job #1559308)

Utilizator elevenstrArina Raileanu elevenstr Data 30 decembrie 2015 16:09:16
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("diviz.in");
ofstream out("diviz.out");
#define MOD 30103
char s[208];
int dp[2][208][105],f[15][208];
//1."lungime subsir" 2.pozitia elementului 3.rest
int main()
{
    int k,a,b,ans=0;
    in>>k>>a>>b;
    in.get();
    in>>s+1;
    int n=strlen(s+1);
    //initializare
    for(int i=n; i>=1; i--)
        for(int j=0; j<=9; j++)
        {
            if(s[i]-'0'==j)f[j][i]=i;
            else f[j][i]=f[j][i+1];
        }
    for(int i=1; i<=9; i++)
        dp[1][f[i][1]][i%k]=1;
    //
    for(int i=1; i<=b; i++)
    {  memset(dp[(i+1)%2],0,sizeof(dp[(i+1)%2]));
        for(int j=i; j<=n; j++)
        {if(i>=a)
                ans=(ans+dp[i%2][j][0])%MOD;
            for(int l=0; l<k; l++)
            {
                if(!dp[i%2][j][l])continue;
                for(int m=0; m<=9; m++)
                    if(f[m][j+1])dp[(i+1)%2][f[m][j+1]][(l*10+m)%k]=(dp[(i+1)%2][f[m][j+1]][(l*10+m)%k]+dp[i%2][j][l])%MOD;
            }
        }
    }
    out<<ans;
    return 0;
}