結果
問題 | No.301 サイコロで確率問題 (1) |
ユーザー | kimiyuki |
提出日時 | 2016-07-05 18:43:16 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,540 bytes |
コンパイル時間 | 320 ms |
コンパイル使用メモリ | 40,960 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-12 20:18:23 |
合計ジャッジ時間 | 2,858 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 325 ms
5,248 KB |
testcase_01 | TLE | - |
ソースコード
#include <cstdio> #include <array> #define repeat(i,n) for (int i = 0; (i) < (n); ++(i)) #define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i)) typedef long long ll; using namespace std; template <typename T, size_t H, size_t W> using matrix = array<array<T,W>,H>; template <typename T, size_t A, size_t B, size_t C> matrix<T,A,C> operator * (matrix<T,A,B> const & p, matrix<T,B,C> const & q) { matrix<T,A,C> r = {}; repeat (y,A) { repeat (z,B) { repeat (x,C) { r[y][x] += p[y][z] * q[z][x]; } } } return r; } template <typename T, size_t A, size_t B> array<T,A> operator * (matrix<T,A,B> const & p, array<T,B> const & q) { array<T,A> r = {}; repeat (y,A) { repeat (z,B) { r[y] += p[y][z] * q[z]; } } return r; } template <typename T, size_t H, size_t W> matrix<T,H,W> matrix_zero() { return {}; } template <typename T, size_t N> matrix<T,N,N> matrix_unit() { matrix<T,N,N> a = {}; repeat (i,N) a[i][i] = 1; return a; } int main() { int t; scanf("%d", &t); while (t --) { ll n; scanf("%lld", &n); array<array<long double,7>,7> af = matrix_unit<long double,7>(); array<array<long double,7>,7> ae { 1./6, 1./6, 1./6, 1./6, 1./6, 1./6, 1 , 1, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 0, 0, 1 }; array<long double,7> ax = { 0, 0, 0, 0, 0, 0, 1 }; array<array<long double,6>,6> bf = matrix_unit<long double,6>(); array<array<long double,6>,6> be { 1./6, 1./6, 1./6, 1./6, 1./6, 1./6 , 1, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0 , 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 1, 0 }; array<long double,6> bx = { 1, 0, 0, 0, 0, 0 }; for (ll i = 1; i <= n; i <<= 1) { if (n & i) { af = af * ae; bf = bf * be; } ae = ae * ae; be = be * be; } long double a = (af * ax)[0]; long double b = (bf * bx)[0]; long double ans = a / b; printf("%.18llf\n", ans); } return 0; }