#include<bits/stdc++.h>
using namespace std;
const int MAXN=200010;
const int mod=1e9+7;
int n,a,sum;
int num[MAXN];
int dp[MAXN][12][2],vis[100];
string l, r;
int read(){
int x=0;
int f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int to(int x){
return 1<<x;
}
int dfs(int pos,int st,int s,int lim,int zero) {
if(s<0 || s>pos){
return 0;
}
if(dp[pos][s][lim]!=-1){
return dp[pos][s][lim];
}
if(!pos){
return dp[pos][s][lim]=(s==0);
}
int maxx=(lim?num[pos]:9);
int minn=(zero?1:0);
int tmp=0;
for(int i=minn;i<=maxx;i++){
if((to(i) & st)==0){
(tmp+=dfs(pos-1,st | to(i),s-1,lim && (i==maxx),0))%=mod;
}
else{
(tmp+=dfs(pos-1,st | to(i),s,lim && (i==maxx),0))%=mod;
}
}
return dp[pos][s][lim]=tmp;
}
int check(string s){
int sss=a;
int siz=s.size();
for(int i=0;i<siz;i++){
int x=s[i]-'0';
if(!vis[x]){
vis[x]=1;
sss--;
if(sss<0){
return 0;
}
}
}
if(sss==0){
return 1;
}
return 0;
}
int solve(string s) {
sum = 0;
int siz = s.size();
for(int i=siz-1;i>=0;i--){
num[++sum]=s[i]-'0';
}
memset(dp,-1,sizeof(dp));
return dfs(sum,0,a,1,1);
}
void ppp() {
int siz=l.size();
for(int i=0;i<siz;i++){
if(r[i]>l[i]){
return;
}
else if(r[i]<l[i]){
printf("0\n");
exit(0);
}
}
return;
}
signed main() {
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
n=read();
cin>>l>>r;
ppp();
a=read();
printf("%d\n",((solve(r)-solve(l)+mod)%mod+check(l))%mod);
return 0;
}