Advertisement
Guest User

Untitled

a guest
Jun 16th, 2012
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.48 KB | None | 0 0
  1. public long countGoodSequences(long K, long A, long B) {
  2.     int[] a = new int[70];
  3.     int[] ab = new int[70];
  4.     int[] aa = new int[70];
  5.     long[] gg = new long[70];
  6.     long ret = 0;
  7.     long x = K;
  8.     if (K == 0 && A == 0) ret++;
  9.     if (K == 0) K = 1;
  10.     gg[0] = 1;
  11.     for (int i = 1; i <= 63; i++) gg[i] = gg[i-1]*2;
  12.     int now=0, nowb=0, nowa=0, tt=0;
  13.     x = B;
  14.     while (x > 0) {
  15.         ab[++nowb] = (int)(x%2);
  16.         x /= 2;
  17.     }
  18.     x = A-1;
  19.     while (x > 0) {
  20.         aa[++nowa] = (int)(x%2);
  21.         x/=2;
  22.     }
  23.     x = K;
  24.     int yy = 0;
  25.     while (x > 0) {
  26.         a[++now] = (int)(x%2);
  27.         x /= 2;
  28.         if (yy == 0 && a[now] == 0) {
  29.             tt++;
  30.         } else {
  31.             yy = 1;
  32.         }
  33.     }
  34.     long y = 0, xx= 0;
  35.     boolean fg = false;
  36.     int z = now;
  37.     if (nowb >= now)
  38.     for (int i = nowb; i >= 1; i--) {
  39.         if (z==0) {
  40.             for (int j = i; j >= 1; j--) {
  41.                 if (ab[j]==1 && fg) {
  42.                     ret += gg[j-1];
  43.                 }
  44.             }
  45.             ret++;
  46.             break;
  47.         }
  48.         if (ab[i] > a[z]) ret += gg[i-1];
  49.         if (ab[i] < a[z]) break;
  50.         z--;
  51.         if (ab[i] == 1) {
  52.             fg = true;
  53.         }
  54.         if (i == 1) ret++;
  55.     }
  56.     for (int i = now; i < nowb; i++) {
  57.         ret += gg[i-now];
  58.     }
  59.     z = now;
  60.     fg = false;
  61.     if (nowa >= now)
  62.     for (int i = nowa; i >= 1; i--) {
  63.         if (z == 0) {
  64.             for (int j = i; j >= 1; j--) {
  65.                 if (aa[j]==1 && fg) ret += gg[j-1];
  66.             }
  67.             ret--;
  68.             break;
  69.         }
  70.         if (aa[i] > a[z]) ret -= gg[i-1];
  71.         if (aa[i] < a[z]) {
  72.             break;
  73.         }
  74.         z--;
  75.         if (ab[i]==1) fg = true;
  76.         if (i == 1) ret--;
  77.     }
  78.     for (int i = now; i < nowa; i++) {
  79.         ret -= gg[i-now];
  80.     }
  81.     return ret;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement