Mai intai trebuie sa te autentifici.
Cod sursa(job #516261)
Utilizator | Data | 23 decembrie 2010 15:48:44 | |
---|---|---|---|
Problema | Diviz | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.56 kb |
#include<cstdio>
#include<cstring>
#define MOD 30103
int n,K,A,B,next[1<<8][10],d[2][1<<8][1<<7];
void copy(int a[10],int b[10])
{
for(int i=0;i<10;i++)
a[i]=b[i];
}
void init()
{
char s[1<<8];
gets(s);
n=strlen(s)-1;
for(int j=0;j<10;j++)
next[n+1][j]=n+1;
for(int i=n;i>=0;i--)
{
copy(next[i],next[i+1]);
next[i][s[i]-'0']=i;
}
}
void reset(int a[1<<7])
{
for(int i=0;i<K;i++)
a[i]=0;
}
void solve()
{
int rez=0;
for(int c=1;c<=9;c++)
if(next[0][c]!=n+1)
d[1][next[0][c]][c%K]=1;
for(int l=1;l<=B;l++)
{
if(l>=A)
{
for(int p=0;p<=n;p++)
{
rez+=d[l&1][p][0];
if(rez>=MOD)
rez-=MOD;
}
}
for(int p=0;p<=n;p++)
reset(d[(l+1)&1][p]);
for(int p=0;p<=n;p++)
for(int r=0;r<K;r++)
if(d[l&1][p][r])
for(int c=0;c<=9;c++)
if(next[p+1][c]!=n+1)
{
d[(l+1)&1][next[p+1][c]][(r*10+c)%K]+=d[l&1][p][r];
if(d[(l+1)&1][next[p+1][c]][(r*10+c)%K]>=MOD)
d[(l+1)&1][next[p+1][c]][(r*10+c)%K]-=MOD;
}
}
printf("%d\n",rez);
}
int main()
{
freopen("diviz.in","r",stdin);
freopen("diviz.out","w",stdout);
scanf("%d%d%d\n",&K,&A,&B);
init();
solve();
return 0;
}