1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[1<<9][5][7][8][9][20];
int f(int add1,int add2,int m){
	int temp=add1*10+add2;
	return temp%m;
}
int shift(int val){
	if(val==-1)return 0;
	return 1<<val;
}
int calc(int bound){
	dp[0][0][0][0][0][0]=1;
	string strBound = to_string(bound);
	cerr <<strBound <<endl;
	int n = strBound.size();
	int prefMask=0;
	int prefMod5=0;
	int prefMod7=0;
	int prefMod8=0;
	int prefMod9=0;
	int act=1;
	for(int i=0;i<n;i++){
		cerr <<i <<endl;
		for(int mask=0;mask<(1<<9);mask++){
			for(int mod5=0;mod5<5;mod5++){
				for(int mod7=0;mod7<7;mod7++){
					for(int mod8=0;mod8<8;mod8++){
						for(int mod9=0;mod9<9;mod9++){
							int my_val = dp[mask][mod5][mod7][mod8][mod9][i];
							if(my_val==0)continue;
							for(int next = (mask==0 ? 0 : 1);next <= 9;next++){
								int newMask = mask | shift(next-1);
								dp[newMask][f(mod5,next,5)][f(mod7,next,7)][f(mod8,next,8)][f(mod9,next,9)][i+1]+=my_val;
							}
						}
					}	
				}
			}
		}
		int here = strBound[i]-'0';
		int my_val = dp[prefMask][prefMod5][prefMod7][prefMod8][prefMod9][i];
		for(int next=here+1;act && next<=9;next++){
			int newMask = prefMask | shift(next-1);
			dp[newMask][f(prefMod5,next,5)][f(prefMod7,next,7)][f(prefMod8,next,8)][f(prefMod9,next,9)][i+1]-=1;
		}
		if(here==0)act=0;
		prefMask |= shift(here-1);
		prefMod5 = f(prefMod5,here,5);
		prefMod7 = f(prefMod7,here,7);
		prefMod8 = f(prefMod8,here,8);
		prefMod9 = f(prefMod9,here,9);
	}
	int ans=0;
	for(int mask=0;mask<(1<<9);mask++){
		for(int mod5=0;mod5<5;mod5++){
			if(mask & (1 << (5-1)) ){
				if(mod5!=0)continue;
			}
			for(int mod7=0;mod7<7;mod7++){
				if(mask & (1 << (7-1)) ){
					if(mod7!=0)continue;
				}
				for(int mod8=0;mod8<8;mod8++){
					if(mask & (1 << (8-1)) ){
						if(mod8!=0)continue;
					}
					if(mask & (1 << (4-1)) ){
						if(mod8!=0 && mod8!=4)continue;
					}
					if(mask & (1 << (2-1)) ){
						if(mod8!=0 && mod8!=2 && mod8!=4 && mod8!=6)continue;
					}
					if(mask & (1 << (6-1)) ){
						if(mod8!=0 && mod8!=2 && mod8!=4 && mod8!=6)continue;
					}
					for(int mod9=0;mod9<9;mod9++){
						if(mask & (1 << (9-1)) ){
							if(mod9!=0)continue;
						}
						if(mask & (1 << (3-1)) ){
							if(mod9!=0 && mod9!=3 && mod9!=6)continue;
						}
						if(mask & (1 << (6-1)) ){
							if(mod9!=0 && mod9!=3 && mod9!=6)continue;
						}
						ans += dp[mask][mod5][mod7][mod8][mod9][n];
					}
				}	
			}
		}
	}
	cerr <<ans <<endl;
	return ans;
}
void reset(){
	for(int i=0;i<19;i++){
		for(int mask=0;mask<(1<<9);mask++){
			for(int mod5=0;mod5<5;mod5++){
				for(int mod7=0;mod7<7;mod7++){
					for(int mod8=0;mod8<8;mod8++){
						for(int mod9=0;mod9<9;mod9++){
							dp[mask][mod5][mod7][mod8][mod9][i]=0;
						}
					}
				}
			}
		}
	}
}
int32_t main(){
	int a,b;
	cin >>a >>b;
	int ans=calc(b);
	reset();
	ans -= calc(a-1);
	cout <<ans;
}