#include using namespace std; typedef long long ll; const int MX = (1<<20); const int MAX = 3001 , MD = 1000000007; ll POW(ll x , ll y){ if(y == 0) return 1; ll ret = POW(x , y/2); ret *= ret; ret %= MAX; if(y % 2) ret *= x; ret %= MAX; return ret; } string str; int K , n; vector < vector < int > > C , cnt; vector < vector < int > > Add ( vector < vector < int > > A , vector < vector < int > > B){ for(int j = 0 ; j < 10 ; j++) for(int i = 0 ; i < MAX ; i++) A[j][i] = (A[j][i] + B[j][i])%MD; return A; } vector < vector < int > > Shift(vector < vector < int > > A , int K){ vector < vector < int > > ret; int c = POW(10 , 1ll * n * K); ret.resize(10); for(auto &pv : ret){ pv.resize(MAX); fill(pv.begin() , pv.end() , 0); } for(int dig = 0 ; dig < 10 ; dig++){ for(int j = 0 ; j < MAX ; j++){ int i = (j * c)%MAX; ret[dig][i] = A[dig][j]; } } return ret; } vector < vector < int > > expo(int K){ if(K == 1){ return C; } auto A = expo(K/2); auto ret = A; ret = Shift(ret , K/2); ret = Add(ret , A); if(K % 2){ ret = Shift(ret , 1); ret = Add(ret, C); } return ret; } void init(){ n = str.size(); C.resize(10); for(auto &pp : C){ pp.resize(MAX); fill(pp.begin() , pp.end() , 0); } cnt.resize(10); for(auto &pp : cnt){ pp.resize(MAX); fill(pp.begin() , pp.end() , 0); } int co = 1; for(int j = 0 ; j < str.size() ; j++){ ++C[str[j] - '0'][co]; co *= 10; co %= MAX; } } ll dp[12][MAX]; ll precalc[10][MAX]; int main(){ #ifdef YALALOV freopen("in.in","r",stdin); #endif // YALALOV cin>>str>>K; reverse(str.begin() , str.end()); init(); cnt = expo(K); ll num = 0; for(int dig = 0 ; dig < 10 ; dig++) for(int j = 0 ; j < MAX ; j++){ ll theta = cnt[dig][j]; theta *= j; theta %= MAX; theta *= dig; theta %= MAX; num += theta; num %= MAX; } for(int dig = 0 ; dig < 10 ; dig++){ for(int coef = 0 ; coef < MAX ; coef++){ for(int tar = 0 ; tar < 10 ; tar++){ int o = ( ( ( tar - dig + MAX ) % MAX ) * coef ) %MAX; if(dig != tar){ precalc[dig][o] += cnt[dig][coef]; precalc[dig][o] %= MD; } } } precalc[dig][0]++; precalc[dig][0]%=MD; } dp[0][num] = 1; bool phase = 0; for(int dig = 0 ; dig < 10 ; dig++){ for(int mod = 0 ; mod < MAX ; mod++){ for(int dif = 0 ; dif < MAX ; dif++){ dp[dig+1][(mod + dif)%MAX] += (1ll * dp[dig][mod] * precalc[dig][dif]); dp[dig+1][(mod + dif)%MAX] %= MD; } } } cout<