Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int *numbers, *lg,ST[300000][100];
  5. int GCD(int a,int b) {
  6.     return abs(b?GCD(b,a%b):a);
  7. }
  8. int myPow(int a)
  9. {
  10.     return 1 << a;
  11. }
  12. void ComputeLogarithms(int m, int* lg)
  13. {
  14.     int i =1, j = 0;
  15.     while (i <= m)
  16.     {
  17.         while (j < myPow(i))
  18.         {
  19.             lg[j] = i - 1;
  20.             j++;
  21.         }
  22.         i++;
  23.     }
  24. }
  25. //n - размер numbers
  26. //numbers - оригинальная последовательность
  27. void Table_Build(int n)
  28. {
  29.     int m = lg[n]+ 1, i = 0, j = 1;
  30.     while (i < n) {
  31.         ST[i][0] = numbers[i];
  32.         i++;
  33.     }
  34.     j = 1;
  35.     while(j < m)
  36.     {
  37.         i = 0;
  38.         while(i <= n - myPow(j)){
  39.             ST[i][j] = GCD(ST[i][j-1], ST[i + myPow(j - 1) ][j-1]);
  40.             i++;
  41.         }
  42.         j++;
  43.     }
  44.    
  45. }
  46. int Table_Query(int l, int r)
  47. {
  48.     int j = lg[r - l + 1];
  49.     //printf("j = %d", j);
  50.     return GCD(ST[l][j], ST[r - myPow(j) + 1 ][j]);
  51. }
  52. int main(int argc, const char * argv[]) {
  53.     int i, n, m, k ,  a, b;
  54.     scanf("%d",&n);
  55.     numbers = (int *)malloc(n *sizeof(int));
  56.     for (i = 0 ; i < n; i++)
  57.         scanf("%d", &numbers[i]);
  58.     k = log2(n)+ 1 ;
  59.     lg = (int*)malloc((myPow(k) + 1)* sizeof(int));
  60.     ComputeLogarithms(k , lg);
  61.     Table_Build(n);
  62.     scanf("%d", &m);
  63.     for (i = 0; i < m; i++) {
  64.         scanf("%d%d", &a, &b);
  65.         printf("%d\n",Table_Query(a, b));
  66.     }
  67.     free(numbers);
  68.     free(lg);
  69.    
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement