The clue is in the boundary radii. They are, as you say, sqrt(i/n) for i = 1 to n. Ugly, but their squares are nicely behaved - evenly spaced multiple of 1/n.
So the code would go something like this (depending on what language you are using)
int whichbucket(double x, double y, int n)
double distsquared = x * x + y * y;
return floor(distsquared * n);