bhupixb

Longest Subarray with gcd atleast k

Sep 19th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3. const int N = 5e5 + 5;
  4. int n , k;
  5. int arr[N];
  6. int pre[N];
  7. int suf[N];
  8. int gcd(int a , int b){
  9. while(b){
  10. int temp = a % b;
  11. a = b;
  12. b = temp;
  13. }
  14. return a;
  15. }
  16. bool check(int val){
  17. for(int i = 1 ; i <= n ; i += val){
  18. int l = i;
  19. int r = min(n , i + val - 1);
  20. pre[l] = arr[l];
  21. for(int j = l + 1 ; j <= r ; ++j){
  22. pre[j] = gcd(pre[j - 1] , arr[j]);
  23. }
  24. suf[r] = arr[r];
  25. for(int j = r - 1 ; j >= l ; --j){
  26. suf[j] = gcd(suf[j + 1] , arr[j]);
  27. }
  28. }
  29. for(int i = 1 ; i + val - 1 <= n ; ++i){
  30. if(gcd(suf[i] , pre[i + val - 1]) >= k){
  31. return 1;
  32. }
  33. }
  34. return 0;
  35. }
  36. int solve(){
  37. int l = 1;
  38. int r = n + 1;
  39. while(l < r){
  40. int mid = l + r >> 1;
  41. if(check(mid)){
  42. l = mid + 1;
  43. }
  44. else{
  45. r = mid;
  46. }
  47. }
  48. return l - 1;
  49. }
  50. int main(){
  51. k = 2;
  52. scanf("%d" , &n );
  53. for(int i = 1 ; i <= n ; ++i){
  54. scanf("%d" , arr + i);
  55. }
  56. printf("%d\n" , solve());
  57. }
Add Comment
Please, Sign In to add comment