program test
implicit none
integer :: i,n,a(300),aa(3)=0,nokori,i1,i2,i3
real(8) :: p(0:300,0:300,0:300)=0,e(0:300,0:300,0:300)=0,psum,esum

read(*,*) n
read(*,*) (a(i),i=1,n)

do i=1,n
	aa(a(i)) = aa(a(i)) + 1
enddo

nokori = aa(1)+aa(2)*2+aa(3)*3

!分岐の確率
p(aa(1),aa(2),aa(3)) = 1

esum = 0

do 
	
	do i3 = 0,int(nokori/3)
		do i2 = 0,int((nokori-i3*3)/2)
			i1 = nokori-i2*2-i3*3
			
			if(i1>=1) then
				p(i1-1,i2,i3) = p(i1-1,i2,i3) +  p(i1,i2,i3) * (i1)/dble(i1+i2+i3)
				e(i1-1,i2,i3) = e(i1-1,i2,i3) + n/dble(i1) * p(i1,i2,i3) * (i1)/dble(i1+i2+i3)
				esum = esum + n/dble(i1+i2+i3) * p(i1,i2,i3) * (i1)/dble(i1+i2+i3)
			endif
			
			if(i2>=1) then
				p(i1+1,i2-1,i3) = p(i1+1,i2-1,i3) +  p(i1,i2,i3) * (i2)/dble(i1+i2+i3)
				e(i1+1,i2-1,i3) = e(i1+1,i2-1,i3) + n/dble(i2) * p(i1,i2,i3) * (i2)/dble(i1+i2+i3)
				esum = esum + n/dble(i1+i2+i3) * p(i1,i2,i3) * (i2)/dble(i1+i2+i3)
			endif
			
			if(i3>=1) then
				p(i1,i2+1,i3-1) = p(i1,i2+1,i3-1) +  p(i1,i2,i3) * (i3)/dble(i1+i2+i3)
				e(i1,i2+1,i3-1) = e(i1,i2+1,i3-1) +  n/dble(i3) * p(i1,i2,i3) * (i3)/dble(i1+i2+i3)
				esum = esum +  n/dble(i1+i2+i3) * p(i1,i2,i3) * (i3)/dble(i1+i2+i3)
			endif
			
		enddo
	enddo
	
	nokori = nokori - 1
		
	if(nokori == 0)then
		goto 100
	endif
	
enddo

100 continue

write(*,*) esum

end program
; 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"

@_QFEa = internal global [300 x i32] undef
@_QFEaa = internal unnamed_addr global [3 x i32] zeroinitializer
@_QFEe = internal unnamed_addr global [301 x [301 x [301 x double]]] zeroinitializer
@_QFEp = internal unnamed_addr global [301 x [301 x [301 x double]]] zeroinitializer
@_QQcl.8ff5234d7a783934e7fa98725e3d50c2 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_5200/source.f\00"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

define void @_QQmain() local_unnamed_addr {
  %1 = alloca i32, align 4
  %2 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.8ff5234d7a783934e7fa98725e3d50c2, i32 6)
  %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.8ff5234d7a783934e7fa98725e3d50c2, i32 7)
  %6 = load i32, ptr %1, align 4, !tbaa !3
  %7 = icmp sgt i32 %6, 0
  br i1 %7, label %.lr.ph.preheader, label %._crit_edge

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

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %9 = phi i64 [ %14, %.lr.ph ], [ 1, %.lr.ph.preheader ]
  %sext = shl i64 %9, 32
  %10 = ashr exact i64 %sext, 32
  %11 = add nsw i64 %10, -1
  %12 = getelementptr [300 x i32], ptr @_QFEa, i64 0, i64 %11
  %13 = call i1 @_FortranAioInputInteger(ptr %5, ptr %12, i32 4)
  %14 = add nuw nsw i64 %9, 1
  %exitcond.not = icmp eq i64 %9, %8
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %0
  %15 = call i32 @_FortranAioEndIoStatement(ptr %5)
  %16 = load i32, ptr %1, align 4, !tbaa !3
  %17 = icmp sgt i32 %16, 0
  br i1 %17, label %.lr.ph59.preheader, label %._crit_edge60

.lr.ph59.preheader:                               ; preds = %._crit_edge
  %18 = zext i32 %16 to i64
  %xtraiter = and i64 %18, 1
  %19 = icmp eq i32 %16, 1
  br i1 %19, label %._crit_edge60.loopexit.unr-lcssa, label %.lr.ph59.preheader.new

.lr.ph59.preheader.new:                           ; preds = %.lr.ph59.preheader
  %unroll_iter = and i64 %18, 4294967294
  br label %.lr.ph59

.lr.ph59:                                         ; preds = %.lr.ph59, %.lr.ph59.preheader.new
  %indvars.iv = phi i64 [ 1, %.lr.ph59.preheader.new ], [ %indvars.iv.next.1, %.lr.ph59 ]
  %niter = phi i64 [ 0, %.lr.ph59.preheader.new ], [ %niter.next.1, %.lr.ph59 ]
  %20 = add nsw i64 %indvars.iv, -1
  %21 = getelementptr [300 x i32], ptr @_QFEa, i64 0, i64 %20
  %22 = load i32, ptr %21, align 4, !tbaa !3
  %23 = sext i32 %22 to i64
  %24 = add nsw i64 %23, -1
  %25 = getelementptr [3 x i32], ptr @_QFEaa, i64 0, i64 %24
  %26 = load i32, ptr %25, align 4, !tbaa !3
  %27 = add i32 %26, 1
  store i32 %27, ptr %25, align 4, !tbaa !3
  %28 = getelementptr [300 x i32], ptr @_QFEa, i64 0, i64 %indvars.iv
  %29 = load i32, ptr %28, align 4, !tbaa !3
  %30 = sext i32 %29 to i64
  %31 = add nsw i64 %30, -1
  %32 = getelementptr [3 x i32], ptr @_QFEaa, i64 0, i64 %31
  %33 = load i32, ptr %32, align 4, !tbaa !3
  %34 = add i32 %33, 1
  store i32 %34, ptr %32, align 4, !tbaa !3
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge60.loopexit.unr-lcssa.loopexit, label %.lr.ph59

._crit_edge60.loopexit.unr-lcssa.loopexit:        ; preds = %.lr.ph59
  %35 = add nuw nsw i64 %indvars.iv, 1
  br label %._crit_edge60.loopexit.unr-lcssa

._crit_edge60.loopexit.unr-lcssa:                 ; preds = %._crit_edge60.loopexit.unr-lcssa.loopexit, %.lr.ph59.preheader
  %indvars.iv.unr = phi i64 [ 0, %.lr.ph59.preheader ], [ %35, %._crit_edge60.loopexit.unr-lcssa.loopexit ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge60, label %.lr.ph59.epil

.lr.ph59.epil:                                    ; preds = %._crit_edge60.loopexit.unr-lcssa
  %36 = getelementptr [300 x i32], ptr @_QFEa, i64 0, i64 %indvars.iv.unr
  %37 = load i32, ptr %36, align 4, !tbaa !3
  %38 = sext i32 %37 to i64
  %39 = add nsw i64 %38, -1
  %40 = getelementptr [3 x i32], ptr @_QFEaa, i64 0, i64 %39
  %41 = load i32, ptr %40, align 4, !tbaa !3
  %42 = add i32 %41, 1
  store i32 %42, ptr %40, align 4, !tbaa !3
  br label %._crit_edge60

._crit_edge60:                                    ; preds = %.lr.ph59.epil, %._crit_edge60.loopexit.unr-lcssa, %._crit_edge
  %43 = load i32, ptr @_QFEaa, align 4, !tbaa !3
  %44 = load i32, ptr getelementptr inbounds ([3 x i32], ptr @_QFEaa, i64 0, i64 1), align 4, !tbaa !3
  %45 = shl i32 %44, 1
  %46 = add i32 %45, %43
  %47 = load i32, ptr getelementptr inbounds ([3 x i32], ptr @_QFEaa, i64 0, i64 2), align 4, !tbaa !3
  %48 = mul i32 %47, 3
  %49 = add i32 %46, %48
  %50 = sext i32 %43 to i64
  %51 = sext i32 %44 to i64
  %52 = sext i32 %47 to i64
  %53 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %52, i64 %51, i64 %50
  store double 1.000000e+00, ptr %53, align 8, !tbaa !3
  %54 = sitofp i32 %16 to double
  br label %55

55:                                               ; preds = %._crit_edge68, %._crit_edge60
  %.046 = phi double [ 0.000000e+00, %._crit_edge60 ], [ %.1.lcssa, %._crit_edge68 ]
  %.0 = phi i32 [ %49, %._crit_edge60 ], [ %213, %._crit_edge68 ]
  %56 = sdiv i32 %.0, 3
  %narrow = add nsw i32 %56, 1
  %57 = sext i32 %narrow to i64
  %58 = icmp sgt i32 %.0, -3
  br i1 %58, label %.lr.ph67, label %._crit_edge68

.lr.ph67:                                         ; preds = %55, %._crit_edge64
  %indvars.iv77 = phi i64 [ %indvars.iv.next78, %._crit_edge64 ], [ 0, %55 ]
  %.165 = phi double [ %.2.lcssa, %._crit_edge64 ], [ %.046, %55 ]
  %59 = trunc i64 %indvars.iv77 to i32
  %60 = mul i32 %59, 3
  %61 = sub i32 %.0, %60
  %62 = icmp sgt i32 %61, -2
  br i1 %62, label %.lr.ph63, label %._crit_edge64

.lr.ph63:                                         ; preds = %.lr.ph67
  %63 = sdiv i32 %61, 2
  %narrow55 = add nuw nsw i32 %63, 1
  %64 = zext i32 %narrow55 to i64
  %.not = icmp eq i64 %indvars.iv77, 0
  %65 = add nuw i64 %indvars.iv77, 4294967295
  %66 = and i64 %65, 4294967295
  %67 = trunc i64 %indvars.iv77 to i32
  %68 = sitofp i32 %67 to double
  %69 = fdiv contract double %54, %68
  %70 = icmp sgt i32 %61, 0
  br i1 %70, label %71, label %97

71:                                               ; preds = %.lr.ph63
  %72 = add nsw i32 %61, -1
  %73 = zext i32 %72 to i64
  %74 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 0, i64 %73
  %75 = load double, ptr %74, align 8, !tbaa !3
  %76 = zext i32 %61 to i64
  %77 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 0, i64 %76
  %78 = load double, ptr %77, align 8, !tbaa !3
  %79 = sitofp i32 %61 to double
  %80 = fmul contract double %78, %79
  %81 = add i32 %61, %67
  %82 = sitofp i32 %81 to double
  %83 = fdiv contract double %80, %82
  %84 = fadd contract double %75, %83
  store double %84, ptr %74, align 8, !tbaa !3
  %85 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEe, i64 0, i64 %indvars.iv77, i64 0, i64 %73
  %86 = load double, ptr %85, align 8, !tbaa !3
  %87 = fdiv contract double %54, %79
  %88 = fmul contract double %87, %78
  %89 = fmul contract double %88, %79
  %90 = fdiv contract double %89, %82
  %91 = fadd contract double %86, %90
  store double %91, ptr %85, align 8, !tbaa !3
  %92 = fdiv contract double %54, %82
  %93 = fmul contract double %92, %78
  %94 = fmul contract double %93, %79
  %95 = fdiv contract double %94, %82
  %96 = fadd contract double %.165, %95
  br label %97

97:                                               ; preds = %.lr.ph63, %71
  %.3.peel = phi double [ %96, %71 ], [ %.165, %.lr.ph63 ]
  br i1 %.not, label %121, label %98

98:                                               ; preds = %97
  %99 = sext i32 %61 to i64
  %100 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %66, i64 1, i64 %99
  %101 = load double, ptr %100, align 8, !tbaa !3
  %102 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 0, i64 %99
  %103 = load double, ptr %102, align 8, !tbaa !3
  %104 = fmul contract double %103, %68
  %105 = add i32 %61, %67
  %106 = sitofp i32 %105 to double
  %107 = fdiv contract double %104, %106
  %108 = fadd contract double %101, %107
  store double %108, ptr %100, align 8, !tbaa !3
  %109 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEe, i64 0, i64 %66, i64 1, i64 %99
  %110 = load double, ptr %109, align 8, !tbaa !3
  %111 = load double, ptr %102, align 8, !tbaa !3
  %112 = fmul contract double %69, %111
  %113 = fmul contract double %112, %68
  %114 = fdiv contract double %113, %106
  %115 = fadd contract double %110, %114
  store double %115, ptr %109, align 8, !tbaa !3
  %116 = fdiv contract double %54, %106
  %117 = fmul contract double %116, %111
  %118 = fmul contract double %117, %68
  %119 = fdiv contract double %118, %106
  %120 = fadd contract double %.3.peel, %119
  br label %121

121:                                              ; preds = %98, %97
  %.5.peel = phi double [ %120, %98 ], [ %.3.peel, %97 ]
  %.off = add i32 %61, 1
  %exitcond75.peel.not = icmp ult i32 %.off, 3
  br i1 %exitcond75.peel.not, label %._crit_edge64, label %.peel.next

.peel.next:                                       ; preds = %121, %212
  %indvars.iv72 = phi i64 [ %indvars.iv.next73.pre-phi, %212 ], [ 1, %121 ]
  %.261 = phi double [ %.5, %212 ], [ %.5.peel, %121 ]
  %indvars.iv72.tr = trunc i64 %indvars.iv72 to i32
  %122 = shl i32 %indvars.iv72.tr, 1
  %123 = add i32 %60, %122
  %124 = sub i32 %.0, %123
  %125 = icmp sgt i32 %124, 0
  br i1 %125, label %126, label %154

126:                                              ; preds = %.peel.next
  %127 = add nsw i32 %124, -1
  %128 = zext i32 %127 to i64
  %129 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 %indvars.iv72, i64 %128
  %130 = load double, ptr %129, align 8, !tbaa !3
  %131 = zext i32 %124 to i64
  %132 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 %indvars.iv72, i64 %131
  %133 = load double, ptr %132, align 8, !tbaa !3
  %134 = sitofp i32 %124 to double
  %135 = fmul contract double %133, %134
  %136 = add nuw nsw i64 %indvars.iv72, %indvars.iv77
  %137 = trunc i64 %136 to i32
  %138 = add i32 %124, %137
  %139 = sitofp i32 %138 to double
  %140 = fdiv contract double %135, %139
  %141 = fadd contract double %130, %140
  store double %141, ptr %129, align 8, !tbaa !3
  %142 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEe, i64 0, i64 %indvars.iv77, i64 %indvars.iv72, i64 %128
  %143 = load double, ptr %142, align 8, !tbaa !3
  %144 = fdiv contract double %54, %134
  %145 = fmul contract double %144, %133
  %146 = fmul contract double %145, %134
  %147 = fdiv contract double %146, %139
  %148 = fadd contract double %143, %147
  store double %148, ptr %142, align 8, !tbaa !3
  %149 = fdiv contract double %54, %139
  %150 = fmul contract double %149, %133
  %151 = fmul contract double %150, %134
  %152 = fdiv contract double %151, %139
  %153 = fadd contract double %.261, %152
  br label %154

154:                                              ; preds = %126, %.peel.next
  %.3 = phi double [ %153, %126 ], [ %.261, %.peel.next ]
  %155 = add i32 %124, 1
  %156 = sext i32 %155 to i64
  %157 = add i64 %indvars.iv72, 4294967295
  %158 = and i64 %157, 4294967295
  %159 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 %158, i64 %156
  %160 = load double, ptr %159, align 8, !tbaa !3
  %161 = sext i32 %124 to i64
  %162 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 %indvars.iv72, i64 %161
  %163 = load double, ptr %162, align 8, !tbaa !3
  %164 = trunc i64 %indvars.iv72 to i32
  %165 = sitofp i32 %164 to double
  %166 = fmul contract double %163, %165
  %167 = add nuw nsw i64 %indvars.iv72, %indvars.iv77
  %168 = trunc i64 %167 to i32
  %169 = add i32 %124, %168
  %170 = sitofp i32 %169 to double
  %171 = fdiv contract double %166, %170
  %172 = fadd contract double %160, %171
  store double %172, ptr %159, align 8, !tbaa !3
  %173 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEe, i64 0, i64 %indvars.iv77, i64 %158, i64 %156
  %174 = load double, ptr %173, align 8, !tbaa !3
  %175 = fdiv contract double %54, %165
  %176 = load double, ptr %162, align 8, !tbaa !3
  %177 = fmul contract double %175, %176
  %178 = fmul contract double %177, %165
  %179 = fdiv contract double %178, %170
  %180 = fadd contract double %174, %179
  store double %180, ptr %173, align 8, !tbaa !3
  %181 = fdiv contract double %54, %170
  %182 = fmul contract double %181, %176
  %183 = fmul contract double %182, %165
  %184 = fdiv contract double %183, %170
  %185 = fadd contract double %.3, %184
  br i1 %.not, label %._crit_edge82, label %186

._crit_edge82:                                    ; preds = %154
  %.pre = add nuw nsw i64 %indvars.iv72, 1
  br label %212

186:                                              ; preds = %154
  %187 = sext i32 %124 to i64
  %188 = add nuw nsw i64 %indvars.iv72, 1
  %189 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %66, i64 %188, i64 %187
  %190 = load double, ptr %189, align 8, !tbaa !3
  %191 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEp, i64 0, i64 %indvars.iv77, i64 %indvars.iv72, i64 %187
  %192 = load double, ptr %191, align 8, !tbaa !3
  %193 = fmul contract double %192, %68
  %194 = add nuw nsw i64 %indvars.iv72, %indvars.iv77
  %195 = trunc i64 %194 to i32
  %196 = add i32 %124, %195
  %197 = sitofp i32 %196 to double
  %198 = fdiv contract double %193, %197
  %199 = fadd contract double %190, %198
  store double %199, ptr %189, align 8, !tbaa !3
  %200 = getelementptr [301 x [301 x [301 x double]]], ptr @_QFEe, i64 0, i64 %66, i64 %188, i64 %187
  %201 = load double, ptr %200, align 8, !tbaa !3
  %202 = load double, ptr %191, align 8, !tbaa !3
  %203 = fmul contract double %69, %202
  %204 = fmul contract double %203, %68
  %205 = fdiv contract double %204, %197
  %206 = fadd contract double %201, %205
  store double %206, ptr %200, align 8, !tbaa !3
  %207 = fdiv contract double %54, %197
  %208 = fmul contract double %207, %202
  %209 = fmul contract double %208, %68
  %210 = fdiv contract double %209, %197
  %211 = fadd contract double %185, %210
  br label %212

212:                                              ; preds = %._crit_edge82, %186
  %indvars.iv.next73.pre-phi = phi i64 [ %.pre, %._crit_edge82 ], [ %188, %186 ]
  %.5 = phi double [ %185, %._crit_edge82 ], [ %211, %186 ]
  %exitcond75.not = icmp eq i64 %indvars.iv.next73.pre-phi, %64
  br i1 %exitcond75.not, label %._crit_edge64, label %.peel.next, !llvm.loop !7

._crit_edge64:                                    ; preds = %212, %121, %.lr.ph67
  %.2.lcssa = phi double [ %.165, %.lr.ph67 ], [ %.5.peel, %121 ], [ %.5, %212 ]
  %indvars.iv.next78 = add nuw nsw i64 %indvars.iv77, 1
  %exitcond80.not = icmp eq i64 %indvars.iv.next78, %57
  br i1 %exitcond80.not, label %._crit_edge68, label %.lr.ph67

._crit_edge68:                                    ; preds = %._crit_edge64, %55
  %.1.lcssa = phi double [ %.046, %55 ], [ %.2.lcssa, %._crit_edge64 ]
  %213 = add i32 %.0, -1
  %214 = icmp eq i32 %213, 0
  br i1 %214, label %215, label %55

215:                                              ; preds = %._crit_edge68
  %216 = call ptr @_FortranAioBeginExternalListOutput(i32 -1, ptr nonnull @_QQcl.8ff5234d7a783934e7fa98725e3d50c2, i32 57)
  %217 = call i1 @_FortranAioOutputReal64(ptr %216, double %.1.lcssa)
  %218 = call i32 @_FortranAioEndIoStatement(ptr %216)
  ret void
}

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 ptr @_FortranAioBeginExternalListOutput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputReal64(ptr, double) local_unnamed_addr

!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"}
!7 = distinct !{!7, !8}
!8 = !{!"llvm.loop.peeled.count", i32 1}
