다만, end값을 처음에는 d가 아니라 k로 뒀다가 1,000,000의 제곱을 절반으로 나눈값이 mid에 들어가서 mid * mid를 할 때, mid가 long long 범위를 넘어선다는 문제가 있다는 것을 발견하고 d로 바꾸었다.
[코드]
#include <string>
#include <vector>
#include <iostream>
using namespace std;
long long binary(long long k, long long d){
long long start = 0;
long long end = d;
long long mid = 0;
long long answer = 0;
while(start<=end){
mid = (start + end) / 2;
if(mid * mid > k){
end = mid - 1;
}
else {
answer = mid;
start = mid + 1;
}
}
return answer;
}
long long solution(int k, int d) {
long long answer = 0;
long long lk = 0;
long long ld = 0;
lk += k;
ld += d;
for(long long i = 0;i<=ld;i+=lk){
//y좌표가 0,1,....늘어날때
//x좌표가 1씩 이동할때마다 해당 좌표에서 answer에 n개 추가
long long len = ld * ld - i * i;
//len의 제곱근 구하기.
long long root_len = binary(len, ld);
//root_len은 제곱근의 가장 큰 정수.
answer += (root_len / lk) + 1;
}
return answer;
}