利用向量计算切点坐标。

#include <iostream>
#include<iomanip>
#include<cmath>
using namespace std;
using ll = long long;
static constexpr double EPS = 1e-8;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(10);
    int q;
    cin >> q;
    while (q--) {
        ll xo, yo, r, xa, ya;
        cin >> xo >> yo >> r >> xa >> ya;
        ll dx = xa - xo, dy = ya - yo;
        ll len2 = dx * dx + dy * dy;
        ll r2   = r * r;
        if (len2 < r2) {
            cout << "1\n";
        } else if (len2 == r2) {
            cout << "2\n";
        } else {
            double d  = sqrt(len2);
            double t  = r2 / d;
            double h  = sqrt(r2 - t * t);
            double ux = dx / d, uy = dy / d;
            double vx = -uy, vy = ux;
            double p1x = xo + t * ux + h * vx;
            double p1y = yo + t * uy + h * vy;
            double p2x = xo + t * ux - h * vx;
            double p2y = yo + t * uy - h * vy;
            cout << "3 " << p1x << ' ' << p1y << ' ' << p2x << ' ' << p2y << '\n';
        }
    }
    return 0;
}