Каждый элемент массива нужно умножить с каждым элементом этого массива и проверить, является ли квадратный корень этого произведения, целым числом.
Массив состоит из 200000 элементов, каждый элемент содержит число(от 1 до 200000).
import java.io.PrintWriter;
import java.util.Random;
import java.util.Scanner;
public class Main {
private boolean bobrotron(long n){
switch((int)(n & 0x3F)){
case 0x00: case 0x01: case 0x04: case 0x09: case 0x10: case 0x11:
case 0x19: case 0x21: case 0x24: case 0x29: case 0x31: case 0x39:
long sqrt;
if(n < 410881L){
int i;
float x2, y;
x2 = n * 0.5F;
y = n;
i = Float.floatToRawIntBits(y);
i = 0x5f3759df - ( i >> 1 );
y = Float.intBitsToFloat(i);
y = y * ( 1.5F - ( x2 * y * y ) );
sqrt = (long)(1.0F/y);
}else{
sqrt = (long)Math.sqrt(n);
}
return sqrt*sqrt == n;
default:
return false;
}
}
private void solve(Scanner in, PrintWriter out){
//int n = in.nextInt();
int n = 20000;
int[] b1 = new int[n];
for (int i = 0; i < n; i++){
//b1[i] = in.nextInt();
b1[i] = new Random().nextInt(200000);
}
long k = 0;
for (int i = 1; i < n; i++){
for (int j = 0; j < i; j++){
if(bobrotron(b1[i] * b1[j])) {
k++;
}
}
}
out.println(k);
}
private void run(){
try(Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out)){
solve(in, out);
}
}
public static void main(String[] args){
new Main().run();
}
}
написал так но он не проходит по времени. как оптимизировать вложенный цикл?
Нельзя так просто взять и оптимизировать вложенный цикл. В любом случае он будет выполняться за O(N^2), в данном случае это порядка 4*10^10 итераций, которые никак не уложатся в лимит.
Нужно пересматривать подход к задаче. Минутка математики:
Имеются два числа a и b. В каких случаях их произведение будет давать полный квадрат?
Разложим оба числа на простые множители:
a = p1k1p2k2...pNkN
b = q1l1q2l2...qMlM
Теперь преобразуем числа: множители с четной степенью «выкинем» из произведения, множители с нечетной оставим без степени. Легко показать, что так мы разделим оба числа на полные квадраты, причем на максимально возможные квадраты на которые эти числа делятся.
Получим числа x и y:
x = pi1pi2...piS
y = qj1qj2...qjT
Если x*y
— полный квадрат, то и a*b
тоже. А x*y
будет полным квадратом только если каждый множитель встречается по два раза. А это в свою очередь возможно только если все множители совпадают и x=y
.
Пример: пусть a = 12, b = 108
Получаем: a = 22*3, b=22*33
x = 3, y = 3
Получились одинаковые числа, значит произведение будет полным квадратом.
Отсюда алгоритм:
X
раз, то из него можно будет образовать X*(X-1)/2
пар. Суммируем эти значения для каждого элемента.Код писать не буду, но алгоритм должен работать быстрее двойного цикла..
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как восстановить нечаянно измененный файл css на Joomla? Бэкапов не делал, кажетсяИмеется ли в системе что-либо наподобие комбинации клавиш "Ctrl+Z"...
Есть (нашел) скрипт, который закрашивает прямоугольную область в html таблицеНужно чтобы эту область можно было копировать, но не получается
Почему у меня не изменяет elenentscrollTop? Вроде бы в одних местах он нормально меняет, а вот в одном месте вообще не хочет