program main
  implicit none
  integer :: N
  character(len=4000) :: S
  integer(8) :: out
  integer :: i,j,k
  integer(8) :: iR(3)
  integer,parameter :: I_R = 1, I_G = 2, I_B = 3
  read(*,*) N
  read(*,*) S
  iR(:) = 0
  do i = 1,N
     if (S(i:i) == "R") then
        iR(I_R) = iR(I_R) + 1
     end if 
     if (S(i:i) == "G") then
        iR(I_G) = iR(I_G) + 1
     end if
     if (S(i:i) == "B")  then
        iR(I_B) = iR(I_B) + 1
     end if
  end do
  out = iR(1)*iR(2)*iR(3)
  do i = 1,N-2
     do j = i+1,N-1
        k = 2*j-i
        !if ( k>N) cycle
        if (k <= N ) then
           if ( (S(i:i) /= S(j:j)) .and. ( S(i:i) /= S(k:k) )&
                .and. (S(j:j) /= S(k:k)) ) then
              out = out - 1
           end if
        end if
     end do
  end do
  write(*,'(i0)') out
  stop
end program main

; ModuleID = 'FIRModule'
source_filename = "FIRModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@_QFEs = internal global [4000 x i8] undef
@_QQcl.964d84b1fcf0eb1f54ec0ddb95af5125 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_1821/source.f\00"
@_QQcl.52 = linkonce constant [1 x i8] c"R"
@_QQcl.47 = linkonce constant [1 x i8] c"G"
@_QQcl.42 = linkonce constant [1 x i8] c"B"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

; Function Attrs: noreturn
define void @_QQmain() local_unnamed_addr #0 {
  %1 = alloca i32, align 4
  %2 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.964d84b1fcf0eb1f54ec0ddb95af5125, i32 9)
  %3 = call i1 @_FortranAioInputInteger(ptr %2, ptr nonnull %1, i32 4)
  %4 = call i32 @_FortranAioEndIoStatement(ptr %2)
  %5 = call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.964d84b1fcf0eb1f54ec0ddb95af5125, i32 10)
  %6 = call i1 @_FortranAioInputAscii(ptr %5, ptr nonnull @_QFEs, i64 4000)
  %7 = call i32 @_FortranAioEndIoStatement(ptr %5)
  %8 = load i32, ptr %1, align 4, !tbaa !3
  %9 = icmp sgt i32 %8, 0
  br i1 %9, label %.lr.ph, label %30

.lr.ph:                                           ; preds = %0
  %10 = zext i32 %8 to i64
  br label %11

11:                                               ; preds = %.lr.ph, %11
  %indvars.iv = phi i64 [ 1, %.lr.ph ], [ %indvars.iv.next, %11 ]
  %12 = phi i64 [ 0, %.lr.ph ], [ %27, %11 ]
  %13 = phi i64 [ 0, %.lr.ph ], [ %23, %11 ]
  %14 = phi i64 [ 0, %.lr.ph ], [ %spec.select37, %11 ]
  %15 = add nsw i64 %indvars.iv, -1
  %16 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %15
  %17 = call i32 @_FortranACharacterCompareScalar1(ptr %16, ptr nonnull @_QQcl.52, i64 1, i64 1)
  %18 = icmp eq i32 %17, 0
  %19 = zext i1 %18 to i64
  %spec.select37 = add i64 %14, %19
  %20 = call i32 @_FortranACharacterCompareScalar1(ptr %16, ptr nonnull @_QQcl.47, i64 1, i64 1)
  %21 = icmp eq i32 %20, 0
  %22 = zext i1 %21 to i64
  %23 = add i64 %13, %22
  %24 = call i32 @_FortranACharacterCompareScalar1(ptr %16, ptr nonnull @_QQcl.42, i64 1, i64 1)
  %25 = icmp eq i32 %24, 0
  %26 = zext i1 %25 to i64
  %27 = add i64 %12, %26
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv, %10
  br i1 %exitcond.not, label %._crit_edge, label %11

._crit_edge:                                      ; preds = %11
  %.pre = load i32, ptr %1, align 4, !tbaa !3
  %28 = mul i64 %23, %spec.select37
  %29 = mul i64 %28, %27
  br label %30

30:                                               ; preds = %._crit_edge, %0
  %31 = phi i32 [ %.pre, %._crit_edge ], [ %8, %0 ]
  %32 = phi i64 [ %29, %._crit_edge ], [ 0, %0 ]
  %33 = add i32 %31, -2
  %34 = icmp sgt i32 %33, 0
  br i1 %34, label %.lr.ph34.preheader, label %._crit_edge35

.lr.ph34.preheader:                               ; preds = %30
  %35 = zext i32 %33 to i64
  br label %.lr.ph34

.lr.ph34:                                         ; preds = %.lr.ph34.preheader, %._crit_edge30
  %indvars.iv41 = phi i64 [ 1, %.lr.ph34.preheader ], [ %indvars.iv.next42, %._crit_edge30 ]
  %.032 = phi i64 [ %32, %.lr.ph34.preheader ], [ %.1.lcssa, %._crit_edge30 ]
  %indvars.iv.next42 = add nuw nsw i64 %indvars.iv41, 1
  %sext = shl i64 %indvars.iv.next42, 32
  %36 = ashr exact i64 %sext, 32
  %37 = load i32, ptr %1, align 4, !tbaa !3
  %38 = add i32 %37, -1
  %39 = sext i32 %38 to i64
  %40 = sub nsw i64 1, %36
  %41 = add nsw i64 %40, %39
  %42 = icmp sgt i64 %41, 0
  br i1 %42, label %.lr.ph29, label %._crit_edge30

.lr.ph29:                                         ; preds = %.lr.ph34
  %43 = trunc i64 %indvars.iv.next42 to i32
  %44 = add nsw i64 %indvars.iv41, -1
  %45 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %44
  %46 = trunc i64 %indvars.iv41 to i32
  br label %47

47:                                               ; preds = %.lr.ph29, %69
  %48 = phi i64 [ %41, %.lr.ph29 ], [ %71, %69 ]
  %49 = phi i32 [ %43, %.lr.ph29 ], [ %70, %69 ]
  %.127 = phi i64 [ %.032, %.lr.ph29 ], [ %.2, %69 ]
  %50 = shl i32 %49, 1
  %51 = sub i32 %50, %46
  %52 = load i32, ptr %1, align 4, !tbaa !3
  %.not = icmp sgt i32 %51, %52
  br i1 %.not, label %69, label %53

53:                                               ; preds = %47
  %54 = sext i32 %49 to i64
  %55 = add nsw i64 %54, -1
  %56 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %55
  %57 = call i32 @_FortranACharacterCompareScalar1(ptr %45, ptr %56, i64 1, i64 1)
  %58 = icmp ne i32 %57, 0
  %59 = sext i32 %51 to i64
  %60 = add nsw i64 %59, -1
  %61 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %60
  %62 = call i32 @_FortranACharacterCompareScalar1(ptr %45, ptr %61, i64 1, i64 1)
  %63 = icmp ne i32 %62, 0
  %64 = and i1 %58, %63
  %65 = call i32 @_FortranACharacterCompareScalar1(ptr %56, ptr %61, i64 1, i64 1)
  %66 = icmp ne i32 %65, 0
  %67 = and i1 %64, %66
  %68 = sext i1 %67 to i64
  %spec.select = add i64 %.127, %68
  br label %69

69:                                               ; preds = %53, %47
  %.2 = phi i64 [ %.127, %47 ], [ %spec.select, %53 ]
  %70 = add i32 %49, 1
  %71 = add nsw i64 %48, -1
  %72 = icmp sgt i64 %48, 1
  br i1 %72, label %47, label %._crit_edge30

._crit_edge30:                                    ; preds = %69, %.lr.ph34
  %.1.lcssa = phi i64 [ %.032, %.lr.ph34 ], [ %.2, %69 ]
  %exitcond44.not = icmp eq i64 %indvars.iv41, %35
  br i1 %exitcond44.not, label %._crit_edge35, label %.lr.ph34

._crit_edge35:                                    ; preds = %._crit_edge30, %30
  %.0.lcssa = phi i64 [ %32, %30 ], [ %.1.lcssa, %._crit_edge30 ]
  %73 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.964d84b1fcf0eb1f54ec0ddb95af5125, i32 36)
  %74 = call i1 @_FortranAioOutputInteger64(ptr %73, i64 %.0.lcssa)
  %75 = call i32 @_FortranAioEndIoStatement(ptr %73)
  %76 = call {} @_FortranAStopStatement(i32 0, i1 false, i1 false)
  unreachable
}

declare ptr @_FortranAioBeginExternalListInput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioInputInteger(ptr, ptr, i32) local_unnamed_addr

declare i32 @_FortranAioEndIoStatement(ptr) local_unnamed_addr

declare i1 @_FortranAioInputAscii(ptr, ptr, i64) local_unnamed_addr

declare i32 @_FortranACharacterCompareScalar1(ptr, ptr, i64, i64) local_unnamed_addr

declare ptr @_FortranAioBeginExternalFormattedOutput(ptr, i64, ptr, i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputInteger64(ptr, i64) local_unnamed_addr

declare {} @_FortranAStopStatement(i32, i1, i1) local_unnamed_addr

attributes #0 = { noreturn }

!llvm.module.flags = !{!0, !1, !2}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!4, !4, i64 0}
!4 = !{!"any data access", !5, i64 0}
!5 = !{!"any access", !6, i64 0}
!6 = !{!"Flang Type TBAA Root"}
