#include using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); auto string16 = [&](long long x) -> string { if(x%15 == 0) return "FizzBuzz"; else if(x%3 == 0) return "Fizz"; else if(x%5 == 0) return "Buzz"; string ret = ""; while(x){ long long r = x%16; x /= 16; if(r < 10) ret += '0'+r; else ret += 'A'+r-10; } reverse(ret.begin(),ret.end()); return ret; }; auto findC = [&](long long L,long long R) -> tuple { long long ret3 = R/3-(L-1)/3,ret5 = R/5-(L-1)/5,ret15 = R/15-(L-1)/15; return {ret3-ret15,ret5-ret15,ret15}; }; auto findR = [&](long long x) -> pair { long long p16 = 1,d = 1; while(true){ auto [f,b,fb] = findC(p16,p16*16-1); x -= p16*15*d; x += (f+b+fb)*d; x -= f*4+b*4+fb*8; if(x < 0){ x += f*4+b*4+fb*8; x -= (f+b+fb)*d; x += p16*15*d; long long low = p16-1,high = p16*16; while(high-low > 1){ long long mid = (high+low)/2; tie(f,b,fb) = findC(p16,mid); long long X = x; X -= (mid-p16+1)*d; X += (f+b+fb)*d; X -= f*4+b*4+fb*8; if(X < 0) high = mid; else low = mid; } tie(f,b,fb) = findC(p16,low); x -= (low-p16+1)*d; x += (f+b+fb)*d; x -= f*4+b*4+fb*8; return {low,x}; } p16 *= 16,d++; } }; vector P16(100,1); for(int i=1; i<100; i++) P16.at(i) = P16.at(i-1)*16; vector>> memo(100,vector>(16,{-1,-1})); auto count = [&](auto count,long long d,long long r) -> tuple { if(d < 0) return {0,0}; if(get<0>(memo.at(d).at(r)) != -1) return memo.at(d).at(r); if(d == 0){ if(r%15 == 0) return {2,1}; if(r%3 == 0 || r%5 == 0) return {1,1}; return {0,0}; } long long ret = 0,ret2 = 0,memor = r; for(int i=0; i<16; i++){ auto [add,minus] = count(count,d-1,r); ret += add; ret2 += minus; if(i == 11 || i == 15) ret += P16.at(d-1)-minus; r = (r+1)%15; } memo.at(d).at(memor) = {ret,ret2}; return {ret,ret2}; }; auto solve = [&](long long x) -> long long { if(x == 0) return 0; auto [R,more] = findR(x); long long ret = 0; long long p16 = 1,d = 0; x = R; while(R >= p16*16){ p16 *= 16; d++; auto [add,minus] = count(count,d,1); ret = add; } long long start = p16; while(d >= 0){ for(int i=0; i<16; i++){ if(start+p16-1 > R) break; string s = string16(start); if(s.back() == 'z'){ s = string16(start+1); if(s.back() == 'z') s = string16(start+2); s.back() = '0'; } long long one = 0; for(auto c : s) one += (c=='F')|(c=='B'); if(p16 > 1){ auto [add,minus] = count(count,d,start%15); ret += add; ret += (p16-minus)*one; } else{ s = string16(start); one = 0; for(auto c : s) one += (c=='F')|(c=='B'); ret += one; } start += p16; } p16 /= 16,d--; } { string last = string16(R+1); for(int i=0; i> X >> Y; cout << solve(Y)-solve(X) << endl; }