Processing math: 100%

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


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

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

У Темирлана недавно был день рождения. Из его друзей самый оригинальный подарок решил сделать его друг, Айсултан. Айсултан знает, что Темирлан любит крутые числа. Число называется крутым, если оно является квадратом целого числа. Например, 0, 9, 121крутые числа; а 50, 3, 12 — не крутые числа. В распоряжении Айсултана есть последовательность из n целых чисел — a1,a2,a3,...,an. Чтобы сообразить подарок, Айсултан берет два числа из этой последовательности aj и ai таких, что j<i и если число ajai является крутым, то он подарит произведение этих двух чисел Темирлану. Помогите понять Айсултану, сколькими способами он может это сделать. Формально, найдите количество пар чисел (aj,ai) таких, что j<i и произведение ajai является крутым числом.
Формат входного файла
Первая строка входных данных содержит одно число n — размер последовательности Айсултана (1n103). Вторая строка входных данных содержит n целых чисел a1,a2,a3,...,an через пробел — последовательность Айсултана (1000ai1000).
Формат выходного файла
В единственной строке выведите одно число — ответ на задачу.
Примеры:
Вход
4
1 0 1 1
Ответ
6
Вход
2
-8 -2
Ответ
1
Вход
3
1 16 4
Ответ
3
Вход
1
0
Ответ
0
Замечание
Данная задача содержит 3 подзадачи.
  1. 0ai1 для всех 1in.
  2. n=2, 1000ai1000.
  3. Ограничения из условия.
В первом примере всего существует 6 пар чисел и все они являются квадратами числа 0 или 1. Во втором примере единственная пара при произведении дает 16, что является квадратом целого числа. В третьем примере все три пары (1, 16), (1, 4), (16, 4) в произедении дают квадрат целого числа. В четвертом примере нет пар. ( Almat Kenen )
посмотреть в олимпиаде

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

  -2
6 года 3 месяца назад #

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

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

  -1
6 года 3 месяца назад #

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

C++

  0
5 года 4 месяца назад #

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

C++

#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;

}

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

C++

  0
5 года 4 месяца назад #

#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
5 года 4 месяца назад #

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

C++

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
3 года 2 месяца назад #

DELETED

  0
4 года 4 месяца назад #

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

C++

  1
3 года 6 месяца назад #

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

C++