3641 - Xorstanta
Cerința
Totuși, combatanții au și ei regretele lor, regrete pe care vor să le depășească
În anul 2018
, Olimpiada Națională de Informatică s-a ținut în Constanța, iar concurenții au fost triști că nicio problemă nu s-a numit Xorstanța.
Se dă un număr n
. De asemenea, ai două variabile a
și b
, inițial egale cu 0
. Apoi, pentru fiecare număr i
de la 1
la n
, trebuie să alegem între a = a ^ i
și b = b ^ i
, unde cu ^
notăm operația XOR
.
Calculați suma maximă ce se poate obține între a
și b
.
Date de intrare
Programul citește de la tastatură numărul t
, reprezentând numărul de teste ce trebuie rezolvate.
Pe fiecare dintre următoarele t
linii se va afla numărul n
.
Date de ieșire
Programul va afișa pe fiecare dintre cele t
linii răspunsul pentru inputul de pe linia i+1
.
Restricții și precizări
1 ≤ t ≤ 100000
1 ≤ n ≤ 1.000.000.000
- Pentru
10
puncte,1 ≤ n ≤ 20
șit = 1
- Pentru
30
de puncte,1 ≤ n ≤ 100000
șit = 1
Exemplu:
Intrare
4 6 30 15 18
Ieșire
7 31 30 43
<syntaxhighlight lang="python3"> def main():
suma_max = 29 numar_t = int(input("T: ")) while numar_t > 0: n = int(input("")) numar_a, numar_b = 0, 0
# Calculează a în funcție de restul împărțirii lui n la 4. if n % 4 == 1: numar_a = 1 elif n % 4 == 2: numar_a = n + 1 elif n % 4 == 3: numar_a = 0 else: numar_a = n
# Calculează b în funcție de puterile lui 2 până la 2^29 care sunt mai mici sau egale cu n. for j in range(suma_max, 0, -1):4 if (1 << j) <= n: numar_b += (1 << j)
# Efectuam operația XOR între a și b și afișam rezultatul. numar_a = numar_a ^ numar_b print(str(numar_a + numar_b) + "\n") numar_t -= 1
if __name__ == "__main__":
main()
</syntaxhighlight>