結果

問題 No.58 イカサマなサイコロ
ユーザー imulanimulan
提出日時 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){
      |     ^~~

ソースコード

diff #

#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;
}
0