program main implicit none integer*8::N,k,tmp,total,i,j integer*8,allocatable::a(:),b(:) integer*8,parameter::modular=1000000007 read *,N,k allocate(a(0:k+1)) allocate(b(0:k+1)) a(0) = 0 a(k+1) = 2**N-1 if(k.ne.0) then read *, a(1:k) end if b = qsort(a) do i=1, k-1 tmp = IAND(b(i),b(i+1)) if(tmp.ne.b(i)) then print '(i0)',0 return end if end do total = 1 do i=0, k tmp = 1 do j=2,POPCNT(b(i+1))-POPCNT(b(i)) tmp = MOD(tmp * j, modular) end do total = MOD(total * tmp, modular) end do print '(i0)', total contains recursive function qsort(x) result(y) integer*8,intent(in) ::x(:) integer*8,allocatable::y(:) integer*8::pivot,total total = size(x) if (total <=1) then y = x else pivot = x(total/2) y = [qsort(pack(x, x .lt. pivot)), & pack(x, x .eq. pivot), & qsort(pack(x, x .gt. pivot))] endif end function qsort end program main