/*
数位DP+堆
这个题比较显然的做法是求出一维的转移,然后再用堆求出二维的前K大,问题是数据太大,无法直接求一维的。
我们可以发现,最大的积在10000左右,所以可以先dfs出所有可能的积,然后用数位DP求出积的个数。
f[i][j][k]表示填了i为,积为j,下一维能否任意填数的方案数。
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#define mod 1000000007
#define lon long long
#define N 400010
using namespace std;
lon n,k,a[N],len,dis[N],cnt,size[N],num[N],f[15][N][2];
struct node{
lon x,y,val;
node(lon a,lon b){x=a;y=b;val=size[num[a]]*size[num[b]];}
bool operator<(node s1) const{
return val<s1.val;
}
};priority_queue<node> q;
lon read(){
lon num=0,flag=1;char c=getchar();
while(c<‘0‘||c>‘9‘){if(c==‘-‘)flag=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
return num*flag;
}
bool cmp(int a,int b){return size[a]>size[b];}
void dfs(lon last,lon dep,lon now){
if(dep==len+1){
dis[++cnt]=now;
return;
}
if(!now) return;
for(lon i=last;i<10;i++)
dfs(i,dep+1,now*i);
}
int main(){
n=read();k=read();
while(n){
a[++len]=n%10;
n/=10;
}
dfs(0,0,1);
dis[++cnt]=0;
sort(dis+1,dis+cnt+1);
cnt=unique(dis+1,dis+cnt+1)-dis-1;
f[0][2][0]=1;
for(lon i=0;i<=len;i++)
for(lon j=1;j<=cnt;j++)
for(lon l=0;l<2;l++)
if(f[i][j][l]){
lon p=(i==0?0:1);
for(;p<10;p++){
f[i+1][lower_bound(dis+1,dis+cnt+1,dis[j]*p)-dis][l+p>a[i+1]]+=f[i][j][l];
}
}
for(lon i=1;i<=cnt;i++){
num[i]=i;
for(lon j=1;j<len;j++)
size[i]+=f[j][i][0]+f[j][i][1];
size[i]+=f[len][i][0];
}
sort(num+2,num+cnt+1,cmp);
q.push(node(2,2));
lon i=0,ans=0;
while(!q.empty()){
node temp=q.top();
q.pop();
ans=(ans+temp.val)%mod;
i++;
if(i>=k) break;
if(temp.x!=temp.y){
ans=(ans+temp.val)%mod;
i++;
if(i>=k) break;
}
if(temp.x!=temp.y) q.push(node(temp.x+1,temp.y));
if(temp.x==2) q.push(node(temp.x,temp.y+1));
}
cout<<ans;
return 0;
}