メモ

yukicoderでゆるふわgolf

yukicoder No.567 コンプリート

問題はこちら
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