結果
問題 | No.301 サイコロで確率問題 (1) |
ユーザー | kimiyuki |
提出日時 | 2016-07-05 18:52:30 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,701 bytes |
コンパイル時間 | 459 ms |
コンパイル使用メモリ | 53,500 KB |
実行使用メモリ | 10,496 KB |
最終ジャッジ日時 | 2024-10-12 20:18:32 |
合計ジャッジ時間 | 6,413 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ソースコード
#include <cstdio> #include <vector> #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() { array<__float128,7> ax = { 0, 0, 0, 0, 0, 0, 1 }; array<__float128,6> bx = { 1, 0, 0, 0, 0, 0 }; vector<array<array<__float128,7>,7> > aes; vector<array<array<__float128,6>,6> > bes; { array<array<__float128,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<array<__float128,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 }; repeat (i,64) { aes.push_back(ae); bes.push_back(be); ae = ae * ae; be = be * be; } } int t; scanf("%d", &t); while (t --) { ll n; scanf("%lld", &n); array<array<__float128,7>,7> af = matrix_unit<__float128,7>(); array<array<__float128,6>,6> bf = matrix_unit<__float128,6>(); repeat (i,64) if (n & (1ll << i)) { af = af * aes[i]; bf = bf * bes[i]; } __float128 a = (af * ax)[0]; __float128 b = (bf * bx)[0]; long double ans = a / b; printf("%.18llf\n", ans); } return 0; }