Каждый элемент массива нужно умножить с каждым элементом этого массива и проверить, является ли квадратный корень этого произведения, целым числом.
Массив состоит из 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
пар. Суммируем эти значения для каждого элемента.Код писать не буду, но алгоритм должен работать быстрее двойного цикла..
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как восстановить нечаянно измененный файл css на Joomla? Бэкапов не делал, кажетсяИмеется ли в системе что-либо наподобие комбинации клавиш "Ctrl+Z"...
Есть (нашел) скрипт, который закрашивает прямоугольную область в html таблицеНужно чтобы эту область можно было копировать, но не получается
Почему у меня не изменяет elenentscrollTop? Вроде бы в одних местах он нормально меняет, а вот в одном месте вообще не хочет