結果
| 問題 |
No.58 イカサマなサイコロ
|
| ユーザー |
|
| 提出日時 | 2018-07-05 21:47:09 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 2,574 bytes |
| コンパイル時間 | 1,563 ms |
| コンパイル使用メモリ | 170,040 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-01 02:41:20 |
| 合計ジャッジ時間 | 2,185 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}star;
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define vv(type, c, m, n, i) vector<vector<type>> c(m, vector<type>(n, i))
#define mat(type, c, m, n) vector<vector<type>> c(m, vector<type>(n));for(auto& r:c)for(auto& i:r)cin>>i;
#define rep(i,a,n) for(int i=(a), i##_len=(n); i<i##_len; ++i)
#define rrep(i,a,n) for(int i=(a), i##_len=(n); i>i##_len; --i)
#define each(x,y) for(auto &(x):(y))
#define var(type, ...)type __VA_ARGS__;Scan(__VA_ARGS__);
template<typename T> void Scan(T& t) { cin >> t; }
template<typename First, typename...Rest>void Scan(First& first, Rest&...rest) { cin >> first; Scan(rest...); }
#define vec(type, c, n) vector<type> c(n);for(auto& i:c) cin>>i;
#define len(x) ((int)(x).size())
#define mp make_pair
#define eb emplace_back
#define em emplace
#define pb pop_back
#define fi first
#define se second
#define get(a, i) get<i>(a)
#define bit_count __builtin_popcount
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<double> vd;
typedef vector<long long> vll;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef pair<int, int> pii;
#define mini min_element
#define maxi max_element
#define sum accumulate
#define chmax(a,b) if(a<b)a=b
#define chmin(a,b) if(a>b)a=b
template <class T> inline void print(T t){cout << t << "\n";}
template <class H, class... T> inline void print(H h, T... t){cout << h << " ";print(t...);}
#define MAX 70
ll sai[11][MAX];
ll ika[11][MAX];
ll A[MAX], B[MAX];
void f2(int n) {
rep(i, 1, n) {
rep(j, i * 4, i * 6 + 1) {
rep(k, 4, 7) {
ika[i + 1][j + k] += ika[i][j] * ika[1][k];
}
}
}
}
void f(int n) {
rep(i, 1, n) {
rep(j, i, i * 6 + 1) {
rep(k, 1, 7) {
sai[i + 1][j + k] += sai[i][j] * sai[1][k];
}
}
}
}
double solve() {
var(int, n, k);
sai[1][1] = sai[1][2] = sai[1][3] = sai[1][4] = sai[1][5] = sai[1][6] = 1;
ika[1][4] = ika[1][5] = ika[1][6] = 2;
f(n);
f2(k);
if (k == 0) {
rrep(i, n * 6, n - 1) {
B[i] = B[i + 1] + sai[n][i];
}
} else if (k == n) {
rrep(i, n * 6, n - 1) {
B[i] = B[i + 1] + ika[n][i];
}
} else {
rep(i, n - k, (n - k) * 6 + 1) {
rep(j, k * 4, k * 6 + 1) {
A[i + j] += sai[n - k][i] * ika[k][j];
}
}
rrep(i, n * 6, n - 1) {
B[i] = B[i + 1] + A[i];
}
}
ll cnt = 0;
rep(i, n, n * 6 + 1) {
cnt += sai[n][i] * B[i + 1];
}
return cnt / pow(6, n * 2);
}
int main() {
cout << setprecision(12) << fixed;
print(solve());
return 0;
}