Zadanie Suma - szkopul

0

Witam, w tresci zadania trzeba wypisac liczbe (2 ^ k - 1) * (2 ^ k) / 2. Czyli dla k = 3, (2 ^ 3 - 1) * (2 ^ 3) / 2 = 7 * 8 / 2 = 56 / 2 = 28. Tylko pytanie jak to zrobic dla k <= 10 ^ 6. Mam na mysli oczywiscie te większe testy, bo 2 ^ (10 ^ 6) to jest ogromna liczba, a jeszcze na koniec trzeba zamienic ja na system dwojkowy. Ma ktos pomysl jak to zrobic inaczej (w taki sposob, zeby komputer nie poddawal sie probujac zapisywac tak ogromne wartosci)? Byc moze jest jakis efektywniejszy sposob na rozwiazanie tego zadania.

moj kod:

#include <iostream>
#include <cmath>

using namespace std;

void f(long long n) {
	if (n > 1) f(n / 2);
	cout << n % 2;
}

int main() {
	int n; cin >> n;
	long long wy = (long long)(pow(2, n) - 1) * pow(2, n) / 2;
	f(wy);
}

ps. tak jak myslalem; 50 % za zadanie. Drugie 50 % testow oblane ze wzgledu na ogromne wartosci.

2

Myślę że w tym tkwi cały... szkopuł *ba dum tss*

(2 ^ k - 1) * (2 ^ k) / 2 to prościej (2 ^ k - 1) * 2 ^ (k - 1) a cokolwiek pomnożone razy 2^n w systemie binarnym to po prostu przesunięcie bitowe.
Czyli musisz tylko wypisać k jedynek (bo to jest odpowiednik 2^k - 1) i dopisać (k - 1) zer. Nie musisz nic nawet konwertować ani mnożyć.

f(4) = 4*'1' + (4-1)*'0' = 1111000
f(5) = 5*'1' + 4*'0' = 111110000
f(100) = 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Gratulacje - niczego się nie nauczyłeś w tym zadaniu. Następnym razem pokombinuj samemu

1 użytkowników online, w tym zalogowanych: 0, gości: 1