2010-12-28 19 views
8

tutaj jest problem zjak znaleźć najmniejszą liczbę operacji obliczyć x^n

ACM International Collegiate

Programming Contest Azja Regional Contest, Yokohama, 2006-11-05

Począwszy od X i wielokrotnie pomnożenie przez x, możemy obliczyć x^31 z trzydziestoma mnożenia:

x^2 = x * x, x^3 = x^2 * x, x^6 = x^3 * x^3, x^7 = x^6 *x, x^14 = x^7 * x^7 , 
x^15 = x^14 * x, x^30 = x^15 * x^15 , x^31 = x^30 * x 

napisać program znaleźć najmniejszej liczby operacji, w celu obliczenia x^n przez mnożenie i dzielenie wychodząc z x dla danej liczby całkowitej n i n<=200

dla n = 31 najmniej #Operations wynosi 6
dla n = 50 najmniej # operacji to 7

Wszelkie pomysły są mile widziane.

+1

Podpowiedź: http://en.wikipedia.org/wiki/Exponentiation_by_squaring –

+4

@Martinho Fernandes - potęgowanie przez kwadraty nie użyje minimalnej liczby operacji. – IVlad

Odpowiedz

11

Zobacz to: http://en.wikipedia.org/wiki/Addition-chain_exponentiation

Nie ma wydajny algorytm, który będzie Ci minimalną liczbę kroków i programowanie dynamiczne nie działa.

Zgaduję, że n jest wystarczająco mały, aby umożliwić przekazanie rozwiązania typu brute force, chociaż może wymagać optymalizacji. Czy wiesz jak to brutalnie zmusić?

+2

+1 Oooh, błyszczące! Sądzę, że mam "nową naukę" na cały dzień. Szkoda, że ​​to NP-zupełny chociaż :( –

+2

Tak, myślę, że wiele osób nauczy się dzisiaj czegoś ciekawego :) +1 też za –

+0

ponieważ jest kompletny NP, a domena n jest stosunkowo mała, skompiluj tabelę i po prostu szukaj. – lijie