結果

問題 No.3344 Common Tangent Line
コンテスト
ユーザー 2251799813685248
提出日時 2025-10-25 16:55:16
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
OLE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,289 bytes
コンパイル時間 1,107 ms
コンパイル使用メモリ 119,512 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-11-13 20:57:32
合計ジャッジ時間 22,357 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 1
other WA * 27 OLE * 13
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <set>
#include <unordered_map>
#include <map>
#include <unordered_set>
#include <queue>
#include <algorithm>
#include <iomanip>
#include <cassert>


using namespace std;
#define ll long long
#define MOD 998244353
#define ld long double
#define INF 2251799813685248
#define vall(A) A.begin(),A.end()
#define gridinput(vv,H,W) for (ll i = 0; i < H; i++){string T; cin >> T; for(ll j = 0; j < W; j++){vv[i][j] = {T[j]};}}
#define adjustedgridinput(vv,H,W) for (ll i = 1; i <= H; i++){string T; cin >> T; for(ll j = 1; j <= W; j++){vv[i][j] = {T[j-1]};}}
#define vin(A) for (ll i = 0, sz = A.size(); i < sz; i++){cin >> A[i];}
#define vout(A) for(ll i = 0, sz = A.size(); i < sz; i++){cout << A[i] << " \n"[i == sz-1];}
#define adjustedvin(A) for (ll i = 1, sz = A.size(); i < sz; i++){cin >> A[i];}
#define adjustedvout(A) for(ll i = 1, sz = A.size(); i < sz; i++){cout << A[i] << " \n"[i == sz-1];}
#define vout2d(A,H,W) for (ll i = 0; i < H; i++){for (ll j = 0; j < W; j++){cout << A[i][j] << " \n"[j==W-1];}}
#define encode(i,j) ((i)<<32)+j
#define decode(v,w) (w ? (v)%4294967296 : (v)>>32)
vector<ll> pow2ll{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296};
vector<ll> pow10ll{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000,10000000000000,100000000000000,1000000000000000,10000000000000000,100000000000000000,1000000000000000000};
vector<ll> di{0,1,0,-1};
vector<ll> dj{1,0,-1,0};

void solve(){
    ll a,b,r1;
    ll c,d,r2;
    cin >> a >> b >> r1 >> c >> d >> r2;

    ld A = a, B = b, C = c, D = d, R1 = r1, R2 = r2;//各数字のlong double版を作成
    
    ll L_squared = (c-a)*(c-a)+(d-b)*(d-b);//円の中心間距離の二乗

    vector<ld> theta(4);
    if (d - b == 0){
        theta[0] = acosl((R1+R2)/abs(C-A));
        theta[1] = -theta[0];
        theta[2] = acosl((R2-R1)/abs(C-A));
        theta[3] = -theta[1];
    }
    if (d - b > 0){
        theta[0] = asinl((R1+R2)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
        theta[1] = M_PIl - asinl((R1+R2)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
        theta[2] = M_PIl + asinl((R2-R1)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
        theta[3] = 2*M_PIl - asinl((R2-R1)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
    }
    if (d - b < 0){
        theta[0] = M_PIl + asinl((R1+R2)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
        theta[1] = 2*M_PIl - asinl((R1+R2)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
        theta[2] = asinl((R2-R1)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
        theta[3] = M_PIl - asinl((R2-R1)/sqrtl(L_squared)) - atanl((C-A)/(D-B));
    }

    for (ll i = 0; i < 4; i++){
        ld s = cosl(theta[i]);
        ld t = sinl(theta[i]);
        ld u = -R1 - B*sinl(theta[i]) - A*cosl(theta[i]);
        ld M = max(abs(s),max(abs(t),abs(u)));
        cout << s/M << " " << t/M << " " << u/M << "\n";
    }
}


int main(){
    ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    ll T;
    cin >> T;
    cout << fixed << setprecision(7);
    for (ll i = 0; i < T; i++){
        solve();
    }
}
0