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


Есеп A. Керемет сыйлық

Ограничение по времени:
1 second
Ограничение по памяти:
256 megabytes

Жақында Темірланның туған күні болды. Ең қызық сыйлықты оның досы Айсұлтан жасады. Айсұлтан Темірланның керемет сандарды ұнататынын біледі. Айсұлтанның ойынша, белгілі бір сан кез келген басқа бір бүтін санның квадратына тең болса, ол сан керемет сан деп есептелінеді. Мысалы, $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 #

кодты корсету/жасыру