题目链接
http://www.bnuoj.com/v3/contest_show.php?cid=9358#problem/C
题目
“清明时节雨纷纷,路上行人欲断魂。”
然而wfy同学的心情是愉快的,因为BNU ACM队出去春游啦!并且,嗯。。。
以下是wfy同学的日记:
昨天,何老师告诉我们:明天我们去春游,大家准备好喝的和吃的哦!
大家听了都兴奋起来,有的欢呼,有的鼓掌,开心得不得了。第二天,我们早早地来到学校,迫不及待地上了车,来到了公园。一进门,啊,太美了!公园中有那么多树,有高有矮,有粗有瘦,密密的,在春风吹拂下轻轻摇摆着,像是欢迎我们的到来。公园中有那么多的鲜花,有红有黄,有紫有白,散发着淡淡的清香,闻得我们都醉了。公园的边角上有一条清澈的小河,河水缓缓地流淌着,可以看到水里的鱼儿在快活地游来游去,多自在啊!水草碧绿碧绿的,多新鲜啊!小河的旁边是一片小树林,远远望去一片鲜绿。我们在里面吃东西、做游戏、捉迷藏,玩得疯极了。树林的后面是连绵起伏的小山坡,蜿蜿的真像一条游动的蛇。当然,我觉得公园的天空也很美。它万里无云,一碧如洗,很清澈。小鸟在展翅飞翔,它们形态各异,一会儿上升,一会儿下滑,一会儿吃虫,一会儿在小树林里休息,非常悠闲。快乐时光总是那么短暂,很快,天色就昏暗了。我们依依不舍地上了车,回到了学校,我真希望明年的春天还能再来看看这美丽的公园。
回到学校后,何老师说:请大家排成一排,我们来拍照片啦!
何老师特别喜欢萌的东西,比如,比如**,等等。
何老师认为,同学们站成一排时,相邻两个同学身高相差越多,这两个同学站在一起越萌。
那么所有相邻两个同学的身高差加起来越大,拍出来的照片就越萌,也就是这张照片的萌力指数。
何老师希望拍出来的照片的萌力指数尽可能大。
然而何老师并不是数学老师,而是语文老师。何老师觉得很GG。
何老师只想知道,如果让同学们随便站成一排(站成所有排列的可能性都相等),萌力指数的数学期望是多少。
聪明的我一下子就算出了答案,然后何老师就奖励了我一个很萌的礼物。
今天真的好开心。
BNU ACM队共有n名同学,身高分别是1, 2, \dots , n,聪明的你能计算出何老师想要的数学期望吗?
Input
第一个是一个正整数T(T \leq 20),表示测试数据的组数,
每组测试数据只有一行,包含一个整数n(2 \leq n \leq 100)。
Output
对于每组测试数据,输出一行,包含一个实数,表示萌力指数的数学期望值,要求相对误差不超过10^{-9},
也就是说,令输出结果为a,标准答案为b,若满足\frac{ \left | a-b \right | }{max(1,b)} \leq 10^{-9},则输出结果会被认为是正确答案。
Sample Input
2
2
3
Sample Output
1.000000000000
2.666666666667
分析
先写一发暴力解法,观察到约分后分母要么为1,要么为3,将其统一为3。然后就发现分子有递推规律(当时只看出递推规律,其实最简单的规律是n^2-1).
暴力解法
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
int a[maxn];
int gcd(int x,int y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++) a[i]=i+1;
int fz=0;
do
{
for(int i=1;i<n;i++) fz+=abs(a[i]-a[i-1]);
}while(next_permutation(a,a+n));
int fm=1;
for(int i=1;i<=n;i++) fm*=i;
cout<<"fz="<<fz<<" "<<"fm="<<fm<<" "<<fz/gcd(fm,fz)<<"/"<<fm/gcd(fz,fm)<<endl;
}
return 0;
}
找出的规律
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
double d[maxn];
void init()
{
d[2]=3;
double k=5;
for(int i=3;i<maxn;i++)
{
d[i]=d[i-1]+k;
k+=2;
}
}
int main()
{
init();
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
printf("%.12lf\n",d[n]/3);
}
return 0;
}