Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public long countGoodSequences(long K, long A, long B) {
- int[] a = new int[70];
- int[] ab = new int[70];
- int[] aa = new int[70];
- long[] gg = new long[70];
- long ret = 0;
- long x = K;
- if (K == 0 && A == 0) ret++;
- if (K == 0) K = 1;
- gg[0] = 1;
- for (int i = 1; i <= 63; i++) gg[i] = gg[i-1]*2;
- int now=0, nowb=0, nowa=0, tt=0;
- x = B;
- while (x > 0) {
- ab[++nowb] = (int)(x%2);
- x /= 2;
- }
- x = A-1;
- while (x > 0) {
- aa[++nowa] = (int)(x%2);
- x/=2;
- }
- x = K;
- int yy = 0;
- while (x > 0) {
- a[++now] = (int)(x%2);
- x /= 2;
- if (yy == 0 && a[now] == 0) {
- tt++;
- } else {
- yy = 1;
- }
- }
- long y = 0, xx= 0;
- boolean fg = false;
- int z = now;
- if (nowb >= now)
- for (int i = nowb; i >= 1; i--) {
- if (z==0) {
- for (int j = i; j >= 1; j--) {
- if (ab[j]==1 && fg) {
- ret += gg[j-1];
- }
- }
- ret++;
- break;
- }
- if (ab[i] > a[z]) ret += gg[i-1];
- if (ab[i] < a[z]) break;
- z--;
- if (ab[i] == 1) {
- fg = true;
- }
- if (i == 1) ret++;
- }
- for (int i = now; i < nowb; i++) {
- ret += gg[i-now];
- }
- z = now;
- fg = false;
- if (nowa >= now)
- for (int i = nowa; i >= 1; i--) {
- if (z == 0) {
- for (int j = i; j >= 1; j--) {
- if (aa[j]==1 && fg) ret += gg[j-1];
- }
- ret--;
- break;
- }
- if (aa[i] > a[z]) ret -= gg[i-1];
- if (aa[i] < a[z]) {
- break;
- }
- z--;
- if (ab[i]==1) fg = true;
- if (i == 1) ret--;
- }
- for (int i = now; i < nowa; i++) {
- ret -= gg[i-now];
- }
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement