На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Рішення «в лоб» передбачає простий перебір варіантів вкладеними циклами:
#include <iostream>
using namespace std;
int main()
{
int a,s=0;
cin >> a;
for(int b=a-1; b>=2; b--)
for(int c=b; c>=2; c--)
for(int d=c-1; d>0; d--)
s++;
cout << s;
return 0;
}Але при великих значеннях a,b,c,d перебір триває декілька секунд, тому створимо формулу для розрахунку варіантів перебору.
#include <iostream>
using namespace std;
int main()
{
int a;
cin >> a;
long int s=0;
for(int i=2; i<a; i++)
s+=i*(i-1)/2;
cout << s;
return 0;
}Поза форумом
Можна знайти залежність, що для 5 відповідь буде дорівнювати сумі 3*1+2*2+1*3, для 6 відповідно 4*1+2*3+3*2+1*4 і т.д. для n
(n-2)*1+(n-3)*2+(n-4)*3+...+2*(n-3)+1*(n-2)
Відредаговано LeonID (2015-11-12 17:36:33)
Поза форумом
https://oeis.org/A000292
Ответ: n(n-1)(n-2)/6
Відредаговано andervish (2015-11-12 18:15:00)
Поза форумом
Чим не правильний цей розв'зок? Підкажіть будь-ласка (Pascal)
Program Profit;
var i:real;
a:integer;
begin
read(a);
if a/2 = round(a/2) then
begin
i:
a-2)/2;
write(2*i*(i+1)*(2*i+1)/3);
end
else
begin
i:
a-3)/2;
write(2*i*(i+1)*(2*i+1)/3+(a-1)*(a-2)/2);
end;
end.
Поза форумом
ttt написав:
Чим не правильний цей розв'зок? Підкажіть будь-ласка (Pascal)
Program Profit;
var i:real;
a:integer;
begin
read(a);
if a/2 = round(a/2) then
begin
i:a-2)/2;
write(2*i*(i+1)*(2*i+1)/3);
end
else
begin
i:a-3)/2;
write(2*i*(i+1)*(2*i+1)/3+(a-1)*(a-2)/2);
end;
end.
Результатом повинно бути ціле число, а ви виводите дробове.
Поза форумом
На всякий случай, упомяну формулы Фаульхабера, может кто-то их не видел:
http://mathworld.wolfram.com/FaulhabersFormula.html
Поза форумом