結果
問題 | No.58 イカサマなサイコロ |
ユーザー | imulan |
提出日時 | 2016-02-04 22:19:54 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,482 bytes |
コンパイル時間 | 1,358 ms |
コンパイル使用メモリ | 158,472 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-21 20:32:39 |
合計ジャッジ時間 | 1,938 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 1 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 1 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
コンパイルメッセージ
main.cpp: In function ‘int main(int, const char**)’: main.cpp:63:17: warning: iteration 57 invokes undefined behavior [-Waggressive-loop-optimizations] 63 | tmp[j+k]+=p[j]/3.0; | ~~~~~~~~^~~~~~~~~~ main.cpp:5:31: note: within this loop 5 | #define rep(i,n) for(int i=0;i<(n);++i) | ^ main.cpp:61:5: note: in expansion of macro ‘rep’ 61 | rep(j,61){ | ^~~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,n) for(int i=0;i<(n);++i) #define each(itr,c) for(__typeof(c.begin()) itr=c.begin(); itr!=c.end(); itr++) #define mp make_pair #define pb push_back #define fi first #define sc second int main(int argc, char const *argv[]) { int n,k; cin >>n >>k; //太郎君、次郎君がそれぞれ出す目の合計の確率 double p[61],q[61]; rep(i,61){ p[i]=0; q[i]=0; } //次郎君の方は普通に計算 q[0]=1; rep(i,n){ //サイコロの個数 double tmp[61]; rep(j,61) tmp[j]=0; rep(j,61){ for(int k=1;k<=6;++k){ tmp[j+k]+=q[j]/6.0; } } rep(j,61) q[j]=tmp[j]; } //rep(i,61) printf("%2d: %.10lf\n",i,q[i]); //太郎君はk個と(n-k)個に分けて計算 p[0]=1; //先に普通のサイコロ(n-k)個ぶん rep(i,n-k){ //サイコロの個数 double tmp[61]; rep(j,61) tmp[j]=0; rep(j,61){ for(int k=1;k<=6;++k){ tmp[j+k]+=p[j]/6.0; } } rep(j,61) p[j]=tmp[j]; } //次にイカサマなサイコロk個ぶん rep(i,k){ //サイコロの個数 double tmp[61]; rep(j,61) tmp[j]=0; rep(j,61){ for(int k=4;k<=6;++k){ tmp[j+k]+=p[j]/3.0; } } rep(j,61) p[j]=tmp[j]; } double ans=0; rep(i,61){//次郎君の出したサイコロの和 for(int j=i+1; j<=60; ++j) ans+=q[i]*p[j]; } printf("%.10lf\n", ans); return 0; }