Задача
Для заданных $n$ натуральных чисел найдите сумму НОД (наибольших общих делителей) всех возможных пар этих чисел.
Входные данные
В первой строке задано количество тестов $n \ (1 < n < 100)$. Каждый тест состоит из одной строки и содержит количество входных чисел $m \ (1 < m < 100)$, за которым следуют $m$ натуральных чисел. Все входные числа натуральные, не превышающие $10^6.$
Выходные данные
Для каждого теста в отдельной строке вывести сумму $НОД$ всех возможных пар.
Тесты
№ | Входные данные | Выходные данные |
1 | 3 4 10 20 30 40 3 7 5 12 3 125 15 25 |
70 3 35 |
2 | 2 3 12 7 8 4 5 14 25 11 |
6 10 |
3 | 4 4 5 6 7 8 4 8 6 2 9 3 2 15 6 5 12 25 29 19 11 |
7 11 6 10 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> using namespace std; int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } int main() { int n, m, sum; cin >> n; while(n-- > 0) { cin >> m; int ns[m]; for(int i = 0; i < m; i++) cin >> ns[i]; sum = 0; for(int i = 0; i < m; i++) { for(int j = i + 1; j < m; j++) sum += gcd(ns[i], ns[j]); } cout << sum << endl; } } |
Решение
Алгоритм решения этой задачи очень простой: чтобы найти сумму НОД всех пар чисел в строке нужно сначала найти все сочетания по два числа из строки, потом посчитать НОД для каждой пары и сложить все НОД.
Ссылки
- Код на ideone
- Задача на e-olymp
- Засчитанное решение на e-olymp