神と神と神様[HDU 2048]

1578 ワード

神様、神様、神様
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17381    Accepted Submission(s): 7409
 
Problem DescriptionHDU 2006'10 ACM contestの授賞式が盛大に始まりました!雰囲気を盛り上げるために、組織者は個別に生麺を開き、賞品が豊富な抽選活動を行いました.この活動の具体的な要求はこうです.
 
まず、パーティーに参加したすべての人は自分の名前が書かれたメモを抽選箱に入れた.それから、すべてのメモが入ってから、一人一人が箱からメモを取ります.最後に、取得したメモに自分の名前が書かれていれば、「おめでとう、当選しました!」
 
当時の盛り上がりを想像してみてください.当選者の賞品はみんなが夢見ていたTwinsサイン写真ですね.しかし、すべてのデザインを試みた喜劇が悲劇的に終わるように、今回の抽選活動は最後に当選した人は一人もいなかった.
 
私の神、神と神様、どうしてこんなことになったのですか.
 
しかし、まず興奮しないでください.今問題が来ました.このような状況が発生する確率を計算してもらえますか.
 
計算できないの?あなたも悲劇で終わりたいの?!
 
 
 
Input入力データの最初の行は整数Cであり、試験例の個数を表し、次いでC行データであり、各行に1つの整数n(1 
 
 
Output各テストインスタンスについて、このような状況が発生した割合を出力してください.各インスタンスの出力は1行を占め、結果は2桁の小数(四捨五入)を保持します.具体的なフォーマットはsample outputを参照してください.
 
 
 
Sample Input12 
 
Sample Output50.00% 
 
Authorlcy 
 
Source递推求解专题练习(For Beginner) 
 
Recommendlcy
全転位配列繰返し式:f(n)=(n−1)(f(n−1)+f(n−2))
#include<stdio.h>

double g[30],f[30];

void prepare()

{

	int i;

	g[1]=0;g[2]=1;

	for (i=3;i<=20;i++) g[i]=(i-1)*(g[i-1]+g[i-2]);

	f[0]=1;

	for (i=1;i<=20;i++) f[i]=i*f[i-1];

}

int main()

{

	int T;

	prepare();

	scanf("%d",&T);

	while (T--)

	{

		int x;

		scanf("%d",&x);

		printf("%.2lf%%
",g[x]*100.0/f[x]); } return 0; }