Problem:
Score : 100 points

Problem Statement

Find the number of integers between 1 and K (inclusive) satisfying the following condition, modulo 10^9 + 7:

The sum of the digits in base ten is a multiple of D.

Constraints

All values in input are integers.

1 \leq K < 10^{10000}

1 \leq D \leq 100

Input

Input is given from Standard Input in the following format:

K
D

Output

Print the number of integers satisfying the condition, modulo 10^9 + 7.

Sample Input 1

30
4

Sample Output 1

6

Those six integers are: 4, 8, 13, 17, 22 and 26.

Sample Input 2

1000000009
1

Sample Output 2

2

Be sure to print the number modulo 10^9 + 7.

Sample Input 3

98765432109876543210
58

Sample Output 3

635270834

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

 #include<bits/stdc++.h>
#include <cstdio>
using namespace std;
#define ll  long long
#define PB push_back
#define ld long double
#define ff first
#define ss second
# define st(v) (v).begin(),(v).end()
#define   pr pair<int,int>
const int N = 1e5+4 , M=N,inf=(int)1e9;
const ll mod=1e9+7;
int fastAbs(int n) { return (n ^ (n >> 31)) - (n >> 31); }
ll multiply(ll a, ll b){ return ((a % mod) * (b % mod)) % mod; }
ll add(ll a, ll b) {     return ((a % mod) + (b % mod)) % mod; }
ll sub(ll a, ll b) { return ((a%mod) - (b % mod)+ mod) % mod ; }
int ans = INT_MAX;
map< pair<int,int> , int > mp;
const int dx[4] = {1,0,0,-1};
const int dy[4] = {0,-1,1,0};
ll dp[10010][2][111];
ll cal( int idx , int n , int tight , string v , int sum  , int d ){
    if(idx==n){
        return (sum%d==0) ;
    }
    if(dp[idx][tight][sum]!=-1 && tight!=1){
        return dp[idx][tight][sum];
    }
    ll res = 0 ;
    int k = (tight)?(v[idx]-'0'):9;
    for( int i=  0 ; i <= k ; i++){
        int new_tight = ( (v[idx]-'0')==i )?tight:0;
        res = add(res,cal(idx+1,n,new_tight,v,(sum+i)%d,d));
    }
    if(!tight){
        dp[idx][tight][sum] = res ;
    }
    return res ;
}
void solve(){
    string s ;
    cin >> s ;
    int d ;
    int n = s.size() ;
    cin >> d ;
    memset(dp,-1,sizeof dp);
    cout << sub(cal(0,n,1,s,0,d),1)<< " " ;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int q=1;
    //cin >> q;
    while(q--)
        solve();
}