문제는 간단히 1사분면 반지름이 d인 원 내부의 k배수의 점들을 구하면 되는 문제이다.
맨처음에 sqrt를 사용해서 풀었는데 sqrt가 실수형 함수여서 오답이 난줄알고 이분탐색으로 sqrt를 구해서 풀었다. 근데 다시 풀어보니 잘 풀린걸 보면 처음에 조건을 잘못 생각해서 틀린듯 싶다.
#include <string>
#include <vector>
using namespace std;
int func(long long i, long long d)
{
long long left = 1, right = d, mid;
int res;
while (left <= right)
{
mid = (left+right)/2;
if (mid*mid + i*i <= d*d)
{
left = mid + 1;
res = mid;
}
else right = mid - 1;
}
return res;// 원 내부 혹은 위의 최대 정수 리턴(사실상 sqrt를 구한것이다.)
}
long long solution(int k, int d)
{
long long answer = d/k + 1;// x축 위의 해당 점들++
for(long long i = 0;i<d;i+=k)
answer += func(i, d)/k;// 문제조건의 점들++
return answer;
}
sqrt를 사용하는게 훨씬 간단하다.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
long long solution(int k, int d)
{
long long answer = d/k + 1;//x축 위의 해당점들
for(long long i=0;i<d;i+=k)
answer += (long long)sqrt(1LL*d*d - i*i)/k;// 해당 조건 점들
return answer;
}