arrows blog

解いた問題などを適当に書いていきます。

AOJ 1286 - Expected Allowance

問題概要

n個のサイコロがあり、それぞれのサイコロには1〜mまでの目がある。
サイコロをn個振ったときの和をSとするとき、S-kの期待値を求めよ。
ただしS-kが0以下になる場合はS-kを1と見なす。

制約

  • 1 ≤ n
  • 2 ≤ m
  • 0 ≤ k < nm
  • nm × mn < 100000000

解法

全探索。
それぞれのサイコロの出目を全て試す。

制約の与えられ方がよくわからなかったが間に合った。

コード

#include <bits/stdc++.h>
 
using namespace std;
 
int N,M,K;
map<int,int> mp;
 
void make(int n,int sum){
  if(N == n){
    if(sum-K <= 0){
      mp[1]++;
    }else{
      mp[sum-K]++;
    }
    return;
  }
  for(int i = 0 ; i < M ; i++){
    make(n+1,sum+i+1);
  }
}
 
int main(){
  while(cin >> N >> M >> K, N){
    mp.clear();
    make(0,0);
    double ans = 0;
    map<int,int>::iterator it;
    for(it = mp.begin() ; it != mp.end() ; ++it){
      ans += ((double)it->second/pow((double)M,N))*it->first;
    }
    printf("%.8f\n",ans);
  }
  return 0;
}