3249 - sumimp3

From Bitnami MediaWiki

Cerința[edit | edit source]

Se citește un număr natural n. Calculați și afișați câte din submulțimile mulțimii {1, 2, ..., n} sunt formate dintr-un număr impar de elemente. Datorită faptului că există foarte multe submulțimi, rezultatul trebuie calculat modulo 9001.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul de submulțimi formate din număr impar de elemente, modulo 9001.

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

  • 1 ≤ n ≤ 2.000.000.000

Exemplu:[edit | edit source]

Intrare

4

Ieșire

8

Explicație[edit | edit source]

Submulțimile mulțimii {1, 2, ..., n} care sunt formate dintr-un număr impar de elemente sunt {1}, {1,2,3}, {1,2,4}, {1,3,4}, {2}, {2,3,4}, {3}, {4}.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> MOD = 9001

def count_odd_subsets(n):

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

def main():

   n = int(input())
   odd_subsets_count = count_odd_subsets(n)
   print(odd_subsets_count)

if __name__ == "__main__":

   main()

</syntaxhighlight>