# AtCoder Beginner Contest 191 Problem D

For AtCoder Contest 191 Problem D, there’s such an AC answer.

``````#include<bits/stdc++.h>
using namespace std;
long double x,y,r;
long long ans=0;
int main()
{
cin>>x>>y>>r;
r+=1e-14;
for(long long i=ceil(x-r);i<=floor(x+r);i++)
{
long double t=sqrt(r*r-(i-x)*(i-x));
ans+=(floor(y+t))-(ceil(y-t))+1;
}
cout<<ans;
return 0;
}
``````

Why the answer doesn’t add epsilon 1e-14 to `x` and `y` but only to `r`?

``````        #include <bits/stdc++.h>
using namespace std;

int main(){
long double X, Y, R;
cin >> X >> Y >> R;

X = abs(X) + abs(ceil(R));
Y = abs(Y) + abs(ceil(R));

long long answer = 0;
for(long long x = ceil(X - R); x <= X + R; ++x){
long double dx = abs(X - x);
long double dy = sqrt(R * R - dx * dx);
long long y1 = floor(Y + dy);
long long y2 = ceil(Y - dy);
answer += (y1 - y2 + 1);
}

return 0;
}
``````
1 Like

Thanks for another solution. But I still don’t understand why…

And this also works:

``````        #include <bits/stdc++.h>
using namespace std;

int main(){
long double X, Y, R;
cin >> X >> Y >> R;

X = X + ceil(R);
Y = Y + ceil(R);

long long answer = 0;
for(long long x = ceil(X - R); x <= X + R; ++x){
long double dx = abs(X - x);
long double dy = sqrt(R * R - dx * dx);
long long y1 = floor(Y + dy);
long long y2 = ceil(Y - dy);
answer += (y1 - y2 + 1);
}

In other words, if any of `x`, `y` or `r` has rounding error so that a grid point is lost, adding 1e-14 to `r` will take back that point; if no grid point is lost (whether or not there are rounding errors), adding 1e-14 won’t mistakenly add more points (as the precision of `x`, `y` and `r` are so big as 1e-4).