結果

問題 No.1688 Veterinarian
ユーザー srjywrdnprktsrjywrdnprkt
提出日時 2023-06-03 17:52:16
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 324 ms / 3,000 ms
コード長 1,451 bytes
コンパイル時間 1,184 ms
コンパイル使用メモリ 121,836 KB
実行使用メモリ 332,256 KB
最終ジャッジ日時 2023-08-28 08:00:54
合計ジャッジ時間 7,408 ms
ジャッジサーバーID
(参考情報)
judge13 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 262 ms
332,168 KB
testcase_01 AC 262 ms
332,124 KB
testcase_02 AC 263 ms
332,084 KB
testcase_03 AC 261 ms
332,052 KB
testcase_04 AC 261 ms
332,052 KB
testcase_05 AC 260 ms
332,220 KB
testcase_06 AC 258 ms
332,124 KB
testcase_07 AC 260 ms
332,084 KB
testcase_08 AC 324 ms
332,256 KB
testcase_09 AC 320 ms
332,120 KB
testcase_10 AC 272 ms
332,140 KB
testcase_11 AC 263 ms
332,116 KB
testcase_12 AC 261 ms
332,080 KB
testcase_13 AC 266 ms
332,192 KB
testcase_14 AC 262 ms
332,176 KB
testcase_15 AC 276 ms
332,116 KB
testcase_16 AC 262 ms
332,172 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <numeric>
#include <deque>
#include <complex>
#include <cassert>

using namespace std;
using ld = long double;

tuple<ld, ld, ld> tp = {-1, -1, -1};
vector<vector<vector<vector<tuple<ld, ld, ld>>>>> ans(51, vector(51, vector(51, vector<tuple<ld, ld, ld>>(51, tp))));

tuple<ld, ld, ld> f(int n, int a, int b, int c){
    if (n == 0) return {0, 0, 0};
    if (ans[n][a][b][c] != tp) return ans[n][a][b][c];
    ld s = a+b+c, pa = a*(a-1)/s/(s-1), pb= b*(b-1)/s/(s-1), pc = c*(c-1)/s/(s-1);
    ld x=0, y=0, z=0, xx, yy, zz;
    tie(xx, yy, zz) = f(n-1, a, b, c);
    x += xx * (1.0l-pa-pb-pc);
    y += yy * (1.0l-pa-pb-pc);
    z += zz * (1.0l-pa-pb-pc);
    if (a>1){
        tie(xx, yy, zz) = f(n-1, a-1, b, c);
        x += (xx+1) * pa;
        y += yy * pa;
        z += zz * pa;
    }
    if (b>1){
        tie(xx, yy, zz) = f(n-1, a, b-1, c);
        x += xx * pb;
        y += (yy+1) * pb;
        z += zz * pb;
    }
    if (c>1){
        tie(xx, yy, zz) = f(n-1, a, b, c-1);
        x += xx * pc;
        y += yy * pc;
        z += (zz+1) * pc;
    }
    return ans[n][a][b][c] = {x, y, z};
}

int main(){

    int a, b, c, n;
    cin >> a >> b >> c >> n;
    ld x, y, z;
    tie(x, y, z) = f(n, a, b, c);
    cout << setprecision(18) << x << " " << y <<  " " << z << endl;

    return 0;
}
0