1489 - Bile1

From Bitnami MediaWiki

Algorel a primit un set de n bile numerotate de la 1 la n pe care trebuie să le pună în trei cutii identice astfel încât în nicio cutie să nu fie două bile numerotate cu numere consecutive.

Cerința[edit | edit source]

În câte moduri poate face Algorel acest lucru?

Date de intrare[edit | edit source]

Fișierul de intrare bile1.in conține pe prima linie numărul n.

Date de ieșire[edit | edit source]

Fișierul de ieșire bile1.out va conține pe prima linie numărul de moduri de distribuire a bilelor.

Restricții și precizări[edit | edit source]

  • n ≤ 300

Exemplu:[edit | edit source]

bile1.in

4

bile1.out

24

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> MOD = 1000000007

def count_ball_distributions(n):

   dp = [[0 for _ in range(4)] for _ in range(n + 1)]
   for i in range(1, n + 1):
       dp[i][1] = 3
   for i in range(2, n + 1):
       for j in range(1, 4):
           dp[i][j] = 0
           if j < 3:
               dp[i][j] += dp[i - 1][j - 1] * 3
               dp[i][j] += dp[i - 2][1] * 3
           if j <= dp[i - 1][0]:
               dp[i][j] += dp[i - 1][j - 1]
   return dp[n][1] % MOD

def main():

   with open("bile1.in", "r") as input_file:
       n = int(input_file.readline())
   ball_distributions_count = count_ball_distributions(n)
   with open("bile1.out", "w") as output_file:
       output_file.write(str(ball_distributions_count))

if __name__ == "__main__":

   main()

</syntaxhighlight>