Qoy — bərabəryanlı üçbucağın tərəfi üzərindəki nöqtələrin sayıdır. Onda onu tam örtmək üçün lazım olan nöqtələrin ümumi sayı ilk natural ədədlərinin cəminə bərabərdir:
Belə ədədlər üçbucaq ədədləri adlanır.
Qoy tam ədədi — verilmiş nöqtələrin sayı olsun. Mümkündürsə, belə bir müsbət tam ədədi tapmaq lazımdır ki,
Tənliyin hər iki tərəfini -yə vuraq və onu standart kvadrat formasına gətirək:
Bu ilə bağlı kvadrat tənlikdir. Onda tam həll olduğu yalnız o halda mümkündür ki, onun diskriminantı tam kvadrat olsun. Diskriminant belə alınır:
Deməli, ədədinin üçbucaq olması yalnız o halda mümkündür ki, d = 1 + 8n tam kvadrata bərabər olsun. Bu halda müsbət həll aşağıdakı formul ilə göstərilir:
Əgər tapılmış dəyəri müsbət tam ədəddirsə, onda üçbucaq ədədidir və üçbucağın tərəfi üzərindəki nöqtələrin sayıdır. Əks halda, üçbucaq ədədi deyil.
Nümunə
n = 55-i nəzərdən keçirək. Bu qiyməti tənliyə yerləşdirək:
Diskriminantı hesablayırıq:
Çünki 441 = 21^2 tam kvadrata uyğundur, bu tənlik tam həllə malikdir. Müsbət həll isə aşağıdakı kimi olur:
Deməli, ədədi üçbucaq ədədidir və nöqtəli üçbucaq təşkil edir.
Algoritmin reallaşdırılması
Testləri ardıcıl olaraq işləyirik. Girişdə dəyərini oxuyuruq.
cs = 1;
while (scanf("%lld", &n), n != -1)
{
printf("Case %d: ", cs++);Kvadrat tənliyin diskriminantını hesablayırıq.
d = 1 + 8 * n;Diskriminantın tam kvadrat olub-olmadığını yoxlayırıq. Bunun üçün sd = ⌊\sqrt{d}⌋ hesablayaraq, sd \cdot sd = d olduğunu təsdiq edirik. Əgər diskriminant tam kvadrat deyilsə, "bad" sətri çıxılır.
sd = (long long)sqrt(d);
if (sd * sd != d)
{
printf("bad\n");
continue;
}Tənliyin müsbət həllini hesablamaq və çıxışa vermək üçün:
k = (-1 + sqrt(d)) / 2;
printf("%lld\n", k);
}