ピーターとコリンはサイコロを投じ, 出た目の合計を比べる. 合計が多い方が勝ちである. もし出た目の合計が等しければ勝負は引き分けになる.
ピーターがコリンに勝つ確率はいくつだろうか? 10進7桁にroundし, 0.abcdefgという形で回答欄に入力せよ.
単純に全パターンを数え上げます。
精度が不安だったのでlong doubleを使ったくらいです。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <iomanip>
const int LIMIT=36;
double ps[LIMIT+1]={0},cs[LIMIT+1]={0};
int main(){
ps[0]=1;
for(int i=0;i<9;i++){
double next[LIMIT+1]={0};
for(int j=36;j>=1;j--){
for(int k=1;(k<=4)&&(k<=j);k++){
next[j]+=ps[j-k];
}
}
memcpy(ps,next,sizeof(next));
}
cs[0]=1;
for(int i=0;i<6;i++){
double next[LIMIT+1]={0};
for(int j=36;j>=1;j--){
for(int k=1;(k<=6)&&(k<=j);k++){
next[j]+=cs[j-k];
}
}
memcpy(cs,next,sizeof(next));
}
ps[0]=0;
cs[0]=0;
long double v=0,l=0,sumV=0,sumL=0;
for(int i=7;i<=36;i++)sumV+=ps[i];
for(int i=6;i<=36;i++){
v+=sumV*cs[i];
l+=sumL*cs[i];
sumV-=ps[i+1];
sumL+=ps[i+1];
}
std::cout<<std::setprecision(7)<<v/(v+l)<<"\n";
}
最終更新:2016年01月26日 09:48