fork download
  1. 【解答】
  2. ・第1問:4938 
  3. ・第2問:164293127179 
  4. 【方針】
  5.  
  6. まず、n=2^k(k>=0,kは整数)の場合を考える。
  7.  
  8. 例えば、n=16 のときは、
  9.  
  10. 0:00000
  11. 1:00001
  12. 2:00010
  13. 3:00011
  14. 4:00100
  15. 5:00101
  16. 6:00110
  17. 7:00111
  18. 8:01000
  19. 9:01001
  20. 10:01010
  21. 11:01011
  22. 12:01100
  23. 13:01101
  24. 14:01110
  25. 15:01111
  26. 16:10000
  27.  
  28. 半角スペースで区切ると
  29. 0:0 0 000
  30. 1:0 0 001
  31. 2:0 0 010
  32. 3:0 0 011
  33. 4:0 0 100
  34. 5:0 0 101
  35. 6:0 0 110
  36. 7:0 0 111
  37.  
  38. 8:0 1 000
  39. 9:0 1 001
  40. 10:0 1 010
  41. 11:0 1 011
  42. 12:0 1 100
  43. 13:0 1 101
  44. 14:0 1 110
  45. 15:0 1 111
  46.  
  47. 16:1 0 000
  48.  
  49.  
  50. n=15のときは、n=7のときの下3桁のパターンが2回あり、
  51. また、815までは、最上位桁の18個あるので、
  52. 以下の様な漸化式が得られる
  53.  
  54. F(15) = F(7) * 2 + 8
  55.  
  56. 816は、11個なので、以下のように変形できる。
  57.  
  58. F(16) = (F(8) - 1) * 2 + 8 + 1
  59. = 2 * F(8) + 8 - 1
  60.  
  61. これを一般化すると
  62.  
  63.  
  64. F(2^k) = 2 * F(2^(k - 1)) + 2^(k - 1) - 1
  65.  
  66. また、
  67. F(0) = 0
  68. F(1) = 1
  69. である。
  70.  
  71.  
  72. 次に、n=2^k+m(k>=02^k>m,k,mは整数)の場合を考える。
  73.  
  74. 例えば、n=21 のときは、
  75.  
  76. 0:0 0 000
  77. 1:0 0 001
  78. 2:0 0 010
  79. 3:0 0 011
  80. 4:0 0 100
  81. 5:0 0 101
  82. 6:0 0 110
  83. 7:0 0 111
  84.  
  85. 8:0 1 000
  86. 9:0 1 001
  87. 10:0 1 010
  88. 11:0 1 011
  89. 12:0 1 100
  90. 13:0 1 101
  91. 14:0 1 110
  92. 15:0 1 111
  93.  
  94. 16:1 0 000
  95. 17:1 0 001
  96. 18:1 0 010
  97. 19:1 0 011
  98. 20:1 0 100
  99. 21:1 0 101
  100.  
  101. F(21)は、F(15)と、1621の下4桁の1の数F(5)1621の最上位桁の1の数6の和となる。
  102. 漸化式では
  103. F(21) = F(15) + F(5) + 6
  104. F(16 + 5) = (F(16) - 1) + F(5) + 5 + 1
  105. = F(16) + F(5) + 5
  106.  
  107. これを一般化すると、
  108. F(n) = F(2^k + m)
  109. = F(2^k) + F(m) + m
  110.  
  111.  
  112. よって、F(n)は、
  113.  
  114. F(0) = 0
  115. F(1) = 1
  116. F(n) = F(2^k) + F(m) + m (n=2^k+m(k>=02^k>m,k,mは整数))
  117. F(2^k) = 2 * F(2^(k - 1)) + 2^(k - 1) - 1
  118.  
  119. 【言語】
  120. Ruby
  121.  
  122. 【コード】
  123.  
  124. @F = {}
  125. def F(n)
  126. return 0 if n == 0
  127. return 1 if n == 1
  128.  
  129. k = Math.log2(n).floor
  130. m = n - (2 ** k)
  131.  
  132. if !@F.has_key?(2 ** k)
  133. @F[2 ** k] = 2 * F(2 ** (k - 1)) + 2 ** (k - 1) - 1
  134. end
  135. if !@F.has_key?(m)
  136. @F[m] = F(m)
  137. end
  138. return @F[2 ** k] + @F[m] + m
  139. end
  140.  
  141. puts F(10 ** 3)
  142. puts F(10 ** 10)
  143.  
  144.  
  145. http://i...content-available-to-author-only...e.com/Dt6SDx
  146.  
  147.  
Runtime error #stdin #stdout #stderr 0.01s 7404KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
prog.rb:1: invalid multibyte char (US-ASCII)