module mdl contains recursive subroutine qsort(a,s,t) integer*8::a(:),s,t,i,j,m if(t-s<=1)return i=s j=t-1 m=a((s+t)/2) do do while(a(i)m) j=j-1 end do if(i>=j)exit a(i)=xor(a(i),a(j)) a(j)=xor(a(i),a(j)) a(i)=xor(a(i),a(j)) i=i+1 j=j-1 end do call qsort(a,s,i) call qsort(a,j+1,t) end subroutine end module program main use mdl implicit none integer*8::B,C,D,N,i,j,k,p,ans=0,arr(3),a(3),dp(0:30,0:7) integer*8,allocatable::E(:) logical::flag read(*,*)B,C,D a(1)=B a(2)=C a(3)=D call qsort(a,1_8,4_8) read*,N allocate(E(N)) read*,(E(i),i=1,N) do i=0,30 do j=0,7 dp(i,j)=0 end do end do dp(0,0)=1 do i=1,N do j=0,7 flag=.false. do k=0,2 if(mod(rshift(j,k),2)==1.or.a(3-k)>E(i))cycle dp(i,or(j,lshift(1,k)))=dp(i,or(j,lshift(1,k)))+dp(i-1,j) flag=.true. exit end do if(.not.flag)dp(i,j)=dp(i,j)+dp(i-1,j) end do do j=0,7 dp(i,j)=dp(i,j)+dp(i-1,j) end do end do print*,dp(N,7) end program