Kvalifikacije 2009 I - Big Digits

Moze li neko da mi objasni zbog cega mi sledeci kod pada na 5. test primeru navedenog zadatka(WA). Kako je sve ostale primere prosao ubedjen sam da je to samo neki corner case, ali nikako ne mogu da ga pronadjem.

Hvala unapred!

Evo linka https://petlja.org/BubbleBee/r/Problemi/2009-kvalifikacije-I-ss-big-digits
Evo koda

#include <bits/stdc++.h>

using namespace std;

long long dp[30][200];

void precalc()
{
    for(int i=0;i<=200;i++)if(i<=9)dp[1][i]=1;else dp[1][i]=0;

    for(int i=2;i<=25;i++)
        for(int j=0;j<=200;j++)
        {
            dp[i][j]=0;
            for(int k=0;k<=9 && k<=j;k++)dp[i][j]+=dp[i-1][j-k];
        }
}

int num_digit(long long a)
{
    if(a==0)return 1;

    int sol=0;

    while(a>0)
    {
        sol++;
        a/=10;
    }

    return sol;
}

int first_digit(long long a)
{
    if(a==0)return 0;

    int sol;
    while(a>0)
    {
        sol=a%10;
        a/=10;
    }

    return sol;
}

long long ste(int a,int b)
{
    if(b==0)return 1;

    if(b%2==0){
        long long x=ste(a,b/2);
        return x*x;
    }

    return a*ste(a,b-1);
}

long long sol(long long x,int s)
{
    if(x<0)return 0;

    int fd=first_digit(x);
    int d=num_digit(x);

    if(s<0)return 0;
    if(s==0)return 1;
    if(d==1 && x>=s)return 1;
    if(d==1 && x<s)return 0;

    long long res=0;
    for(int i=0;i<fd;i++)if(s>=i)res+=dp[d-1][s-i];

    res+=sol(x-fd*ste(10,d-1),s-fd);

    return res;
}

int main()
{
    precalc();

    long long l,r;
    int s;

    /*for(int i=0;i<=5;i++)
        for(int j=0;j<=20;j++)printf("dp[%d][%d]=%lld\n",i,j,dp[i][j]);*/

    scanf("%lld%lld%d",&l,&r,&s);
    printf("%lld",sol(r,s)-sol(l-1,s));
    return 0;
}