fork download
  1. def is_valid(bit)
  2. sum = 0
  3. bit.chars.map{ |b|
  4. if b == "1" then
  5. sum += 3
  6. return false if sum < 0
  7. else
  8. sum -= 2
  9. return false if sum < 0
  10. end
  11. }
  12. return true
  13. end
  14.  
  15. def combi(p, m, a)
  16. if m == 0 then
  17. if a[@p-1] == 1 then
  18. bit = sprintf("%0" + @p.to_s + "b", a)
  19. if is_valid(bit) then
  20. @cnt += 1
  21. end
  22. end
  23. elsif m == p then
  24. if a[@p-1] == 1 then
  25. bit = sprintf("%0" + @p.to_s + "b", a | ((1 << m) - 1))
  26. if is_valid(bit) then
  27. @cnt += 1
  28. end
  29. end
  30. else
  31. combi(p-1, m, a)
  32. combi(p-1, m-1, a | (1 << (p - 1)))
  33. end
  34. end
  35.  
  36. @p = gets.chomp.to_i
  37. @cnt = 0
  38.  
  39. (0..@p).to_a.permutation(2).each do |p|
  40. sum = p.inject(:+)
  41. next if sum != @p
  42. m = p[0]
  43. n = p[1]
  44. next if m == 0
  45. next if (m * 3) < (n * 2)
  46. if @p == m then
  47. @cnt += 1
  48. next
  49. end
  50. combi(@p, m, 0)
  51. end
  52.  
  53. puts @cnt
Success #stdin #stdout 4.23s 28216KB
stdin
21
stdout
581219