Идея в том что нижняя строка постоянно увеличивается на число которое увеличивается на единицу
то есть
1 3 6 10 15 21 ...
+2 +3 +4 +5 +6 ....
вот этот возрастающий ряд сравниваю с введенным n, как только элемент ряда становится равным или больше n значит можно теперь высчитать координаты.
#include <iostream>
using namespace std;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n = 0;
scanf("%d",&n);
if(n == 1){ printf("x = 1 y = 1"); return 0;}
int iter = 1;
for(int i = 2; ;i++){
iter += i;
if(iter >= n){
int d = iter - n;
printf("х = %d y = %d",i-d,d+1);//высчитываю координаты
return 0;
}
}
return 0;
}
это решение за O(sqrt(n)), и тут где-то ошибка.
Номер диагонали можно не циклом вычислять как у меня а решив уравнение
KADR:
n*(n+1)<=a*2
n^2+n-a*2<=0
тогда цикл вообще не нужен, решение будет за O(1).