プロジェクトオイラー問205

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20205
Problem 205 「サイコロゲーム」 †
ピーターは4面のサイコロを9つ持っている. サイコロの各面には1, 2, 3, 4と書いてある. コリンは6面のサイコロを6つ持っている. サイコロの各面には1, 2, 3, 4, 5, 6と書いてある.

ピーターとコリンはサイコロを投じ, 出た目の合計を比べる. 合計が多い方が勝ちである. もし出た目の合計が等しければ勝負は引き分けになる.

ピーターがコリンに勝つ確率はいくつだろうか? 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