Районная олимпиада по информатике. 2018-2019 учебный год. 8-11 классы


Задача A. Крутой подарок

Ограничение по времени:
1 секунда
Ограничение по памяти:
256 мегабайт

У Темирлана недавно был день рождения. Из его друзей самый оригинальный подарок решил сделать его друг, Айсултан. Айсултан знает, что Темирлан любит крутые числа. Число называется крутым, если оно является квадратом целого числа. Например, $0$, $9$, $121$ — крутые числа; а $50$, $3$, $12$ — не крутые числа. В распоряжении Айсултана есть последовательность из $n$ целых чисел — $a_1, a_2, a_3, ..., a_n$. Чтобы сообразить подарок, Айсултан берет два числа из этой последовательности $a_j$ и $a_i$ таких, что $j < i$ и если число $a_j * a_i$ является крутым, то он подарит произведение этих двух чисел Темирлану. Помогите понять Айсултану, сколькими способами он может это сделать. Формально, найдите количество пар чисел $(a_j, a_i)$ таких, что $j < i$ и произведение $a_j * a_i$ является крутым числом.
Формат входного файла
Первая строка входных данных содержит одно число $n$ — размер последовательности Айсултана $(1 \le n \le 10^3)$. Вторая строка входных данных содержит $n$ целых чисел $a_1, a_2, a_3, ..., a_n$ через пробел — последовательность Айсултана $(-1000 \le a_i \le 1000)$.
Формат выходного файла
В единственной строке выведите одно число — ответ на задачу.
Примеры:
Вход
4
1 0 1 1
Ответ
6
Вход
2
-8 -2
Ответ
1
Вход
3
1 16 4
Ответ
3
Вход
1
0
Ответ
0
Замечание
Данная задача содержит 3 подзадачи.
  1. $0 \le a_i \le 1$ для всех $1 \le i \le n$.
  2. $n = 2$, $-1000 \le a_i \le 1000$.
  3. Ограничения из условия.
В первом примере всего существует 6 пар чисел и все они являются квадратами числа 0 или 1. Во втором примере единственная пара при произведении дает 16, что является квадратом целого числа. В третьем примере все три пары (1, 16), (1, 4), (16, 4) в произедении дают квадрат целого числа. В четвертом примере нет пар. ( Almat Kenen )
посмотреть в олимпиаде

Комментарий/решение:

  -2
2019-01-07 23:51:56.0 #

чтобы решить эту задачу, просто найти сколькими способами из n числов можно создать пар

значить просто возпользуемся формулам математики n!/(2*(n-2))

  -1
2019-01-08 20:26:03.0 #

показать/скрыть код

  0
2019-12-02 18:59:56.0 #

показать/скрыть код

#include <bits/stdc++.h>

using namespace std;

int n, num[10005];//size, array

int k;//create counter

int main() {

cin >> n;

for (int i = 1; i <= n; i++){

cin >> num[i];

}

for (int i = 1; i <= n; i++) {

for (int j = i + 1; j <= n; j++) {

//check number

if ( num[i]*num[j] >= 0)

if((double) sqrt(num[i]*num[j]) == (int) sqrt(num[i]*num[j])){

k++;//update counter

}

}

}

cout << k;//answer

return 0;

}

показать/скрыть код

  0
2019-12-03 23:33:32.0 #

#include <bits/stdc++.h>

using namespace std;

int main()

{

int n,a,counter=0;cin>>n;int mas[2001]={0};float san;

for(int i=0;i<n;i++)

{

scanf("%d",&a);mas[a+1000]++;

}

for(int i=0;i<=2000;i++)

{ if(mas[i]==0)continue;

counter+=(mas[i]-1)*(mas[i])/2;

for(int q=i+1;q<=2001;q++)

{

if(mas[q]==0)continue;

san=sqrt((i-1000)*(q-1000));

if(san==floor(san)&&san==ceil(san)){counter+=mas[i]*mas[q];}

}

}

printf("%d",counter);

}

решение через некий перебор

  -1
2019-12-10 20:38:23.0 #

показать/скрыть код

n = int(input())

arr = list(map(int, input().split()))

cntr = 0

for i in range(n):

for j in range(i+1, n):

if (arr[i] * arr[j])**0.5 % 1 == 0:

cntr += 1

print(cntr)

пред. Правка 2   0
2022-01-18 11:12:11.0 #

DELETED

  0
2020-11-28 10:57:42.0 #

показать/скрыть код

  1
2021-09-27 14:33:52.0 #

показать/скрыть код