#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define all(x) (x).begin(), (x).end() #define bit(x) (1 << (x)) #define cnt1(x) (__builtin_popcount(x)) #define LB lower_bound #define LET(it,v) __typeof(v) it(v) #define mset0(x) memset((x), 0, sizeof((x))) #define mset1(x) memset((x), -1, sizeof((x))) #define pb push_back #define PQ priority_queue #define REP(it,v) for(LET(it,v.begin());it!=v.end();it++) #define sqr(x) ((x)*(x)) #define sz(x) ((int)(x.size())) #define UB upper_bound #define X first #define Y second typedef long long LL; typedef double DB; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vpii; template inline void chkmin(T &a, T b) { if (b < a) a = b; } template inline void chkmax(T &a, T b) { if (a < b) a = b; } const int MX = 100005; const int MOD = 1000000007; char s[MX], t[MX]; int cnt[MX][17]; void add(int &a, int b) { a += b; if (a >= MOD) a -= MOD; } LL calc(char *s) { int n = strlen(s); LL rlt = 0; int cur = 0; for (int i = 0; i < n; i++) { int k = s[i] - '0'; for (int j = 0; j < k; j++) { for (int h = 0; h < 16; h++) { rlt += (LL)cnt[n - i - 1][h] * (h ^ j ^ cur); } rlt %= MOD; } cur ^= k; } return rlt; } void init() { cnt[0][0] = 1; for (int i = 0; i < 10; i++) cnt[1][i] = 1; for (int i = 1; i < MX - 1; i++) { for (int j = 0; j < 16; j++) { for (int k = 0; k < 10; k++) { add(cnt[i + 1][k ^ j], cnt[i][j]); } } } } int main() { int T, Tc = 0; init(); for (scanf("%d", &T), Tc = 1; T--; Tc++) { scanf("%s%s", s, t); printf("Case #%d: ", Tc); LL ans = calc(t) - calc(s); int cur = 0; for (int i = 0; t[i]; i++) cur ^= (t[i] - '0'); ans = ((ans % MOD + MOD) + cur) % MOD; printf("%d\n", int(ans)); } return 0; }