Hackerrank – Popis problému
Celý popis zadania sa nacháza – Hackerrank.
Riešenie
Prechádzam všetky čísla od 1
po N
. Potrebujem urobiť celočíselný rozklad čísla na prvočísla. Vznikne nám takýto stav:
. Prvočísla si viem určiť napr. cez Eratosthenovo sito. Určím si exponenty. Urobím product hodnôt všetkých exponentov:
.
Ak má nejaké číslo hodnotu
väčšiu ako zadaný počet, vypíšeme ho, lebo to je náš výsledok.
Celočíselný rozklad nám umožnuje získať celkový počet deliteľov. Napr.
je deliteľné
a
, teda rozklad
na prvočísla je:
.
Ak si rozložíme číslo
:
Všetky delitele
sú kombinácie čísel vzniknutých kombinovaním daného rozsahu exponentu. Napr. pre
môžme
kombinovať od
po
a
od
po
. Vznikne tieto kombinácie:
1 2 3 4 5 6 7 8 |
1 = 2^0 * 3^0 2 = 2^1 * 3^0 3 = 2^0 * 3^1 4 = 2^2 * 3^0 6 = 2^1 * 3^1 8 = 2^3 * 3^0 12 = 2^2 * 3^1 24 = 2^3 * 3^1 |
Pre
máme
deliteľov – jeden exponent má hodnotu
a druhý hodnotu
. Ale keďže môžme použiť aj
ako exponent. Teda musíme vynásobiť každý exponent zvýšený o
.
Vytvoril som riešenie v týchto programovacích jazykoch:
Všetky riešenia sú dostupné aj na mojom GitHub profile.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class HighlyDivisibleTriangularNumber { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<integer> primes = eratosthenes(10000000); int tests = Integer.parseInt(scanner.nextLine()); for (int i = 0; i < tests; i++) { int num = 0; int div = 0; int divisors = Integer.parseInt(scanner.nextLine()); outer: for (int number = 1; number < Integer.MAX_VALUE; number++) { int counter = 1; num += number; int n = num; for (int j = 0; j < primes.size() && div < n; j++) { div = primes.get(j); int exp = 0; while (n % div == 0) { exp++; n /= div; } counter *= (exp + 1); if (counter > divisors) { System.out.println(num); break outer; } } } } scanner.close(); } private static List<integer> eratosthenes(int number) { boolean[] array = new boolean[number + 1]; for (int i = 0; i < array.length; i++) { array[i] = true; } List<integer> primes = new ArrayList<integer>(); for (int i = 2; i < array.length; i++) { if (array[i]) { int j = i; while (i * j >= 0 && i * j < array.length) { array[i * j] = false; j++; } primes.add(i); } } return primes; } } </integer></integer></integer></integer> |