program main implicit none integer*8::N,k,total,i,j integer*8,allocatable::a(:),b(:) integer*8,parameter::modular=1000000007 integer*8::perm(0:60) data perm/ 1, 1, 2, 6, 24, 120,& 720, 5040, 40320, 362880, 3628800,& 39916800,479001600,227020758,178290591,674358851,& 789741546,425606191,660911389,557316307,146326063,& 72847302,602640637,860734560,657629300,440732388,& 459042011,394134213, 35757887, 36978716,109361473,& 390205642,486580460, 57155068,943272305, 14530444,& 523095984,354551275,472948359,444985875,799434881,& 776829897,626855450,954784168, 10503098,472639410,& 741412713,846397273,627068824,726372166,318608048,& 249010336,948537388,272481214,713985458,269199917,& 75195247,286129051,595484846,133605669, 16340084 / 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 if(IAND(b(i),b(i+1)).ne.b(i)) then print '(i0)',0 return end if end do total = 1 do i=0, k total = MOD(total * perm(POPCNT(b(i+1))-POPCNT(b(i))), 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