問題はこちら
No.567 コンプリート - yukicoder
包除原理やるだけ(説明は後述)
main(n){ scanf("%d",&n); printf("%.9f", 1 - 6*pow(5/6.,n) +15*pow(4/6.,n) -20*pow(3/6.,n) +15*pow(2/6.,n) - 6*pow(1/6.,n) ); }
事象A1,…,A6を、
A1:1が出ない
…
A6:6が出ない
とおく。このとき、6種類が揃う確率は、余事象を考えて 1-P(A1∪A2∪A3∪A4∪A5∪A6)となる。
ところで明らかに
P(Ai)=(5/6)^n
P(Ai∩Aj)=(4/6)^n (i≠j)
……
であるから、包除原理より冒頭のプログラムの式が得られる
単に式を書き換えるよりも、for文で1つにまとめてしまった方が短くなった。
powの前についている係数は二項係数なので順次計算できることに注意して次のように書ける
double A; n,i; main(s){ for(scanf("%d",&n);++i<7;A+=pow(i/6.,n)*s)s=s*(i-7)/i; printf("%.9f",A); }
93B