..退化为一天两题了,药丸..

【题目大意】

给出n根木棍的长度,求从其中取出3根能组成三角形的概率。

【思路】

然后枚举求前缀和,枚举最长边。假设最长边为l,先求出所有两边之和大于它的情况数。然后减去两边都大于它的情况以及一大一小的情况。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<complex>
#include<cmath>
#define pi acos(-1)
using namespace std;
const int MAXN = ;
typedef complex<double> com;
typedef long long ll;
int n,m,L,tmpn;
com a[MAXN],b[MAXN];
int c[MAXN],Rev[MAXN],l[MAXN],len;
ll sum[MAXN],num[MAXN];//把sum和num放在子程序里就会错误,放进主程序就可以,为什么?? void get_bit(){for (n=,L=;n<m;n<<=) L++;}
void get_Rtable(){for (int i=;i<n;i++) Rev[i]=(Rev[i>>]>>)|((i&)<<(L-));}
void multi(com* a,com* b){for (int i=;i<n;i++) a[i]*=b[i];} void FFT(com* a,int flag)
{
for (int i=;i<n;i++)if(i<Rev[i])swap(a[i],a[Rev[i]]); //利用逆序表,快速求逆序
for (int i=;i<n;i<<=)
{
com wn(cos(*pi/(i*)),flag*sin(*pi/(i*)));
for (int j=;j<n;j+=(i<<))
{
com w(,);
for (int k=;k<i;k++,w*=wn)
{
com x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y;
a[j+k+i]=x-y;
}
}
}
if (flag==-) for (int i=;i<n;i++) a[i]/=n;
} void init()
{
int tmp[MAXN/];
scanf("%d",&n);
tmpn=n;
memset(tmp,,sizeof(tmp));
memset(Rev,,sizeof(Rev));
len=-;
for (int i=;i<n;i++)
{
scanf("%d",&l[i]);
if (len<l[i]) len=l[i];
tmp[l[i]]++;
}
for (int i=;i<MAXN;i++) a[i]=b[i]=();
for (int i=;i<=len;i++) a[i]=(tmp[i]);
} void solve()
{
m=len<<;
len++;m++;
get_bit();
get_Rtable();
FFT(a,);
for (int i=;i<n;i++) b[i]=a[i];
multi(a,b);
FFT(a,-);
} void get_ans()
{
memset(sum,,sizeof(sum));
memset(num,,sizeof(num));
for (int i=;i<m;i++) num[i]=(ll)(a[i].real()+0.5);
//减掉取两个相同的组合
for(int i =;i<tmpn;i++)
{
num[l[i]+l[i]]--;
}
for (int i=;i<m;i++) num[i]/=;
sum[]=; for (int i=;i<m;i++) sum[i]=sum[i-]+num[i]; ll cnt=;
n=tmpn;
for (int i=;i<n;i++)
{
cnt+=sum[m-]-sum[l[i]];
//减掉一个取大,一个取小的
cnt-= (ll)(n--i)*i;
//减掉一个取本身,另外一个取其它
cnt-= (n-);
//减掉大于它的取两个的组合
cnt-= (ll)(n--i)*(n-i-)/;
}
ll tot = (ll)n*(n-)*(n-)/;
printf("%.7lf\n",(double)cnt/tot); } int main()
{
int T;
scanf("%d",&T);
while (T--)
{
init();
solve();
get_ans();
}
return ;
}

最新文章

  1. 无法远程到2008R2的解决方法
  2. RecyclerView局部刷新那点事
  3. oracle的resetlogs机制浅析(转)
  4. jquery过滤器之:contains()、.filter()
  5. String.format中大括号的加入方法
  6. 将access数据库导入mysql
  7. C#操作Excel,对Sheet插入次序的控制 (有待完善)
  8. android 写文件权限
  9. 网站卡死,照惯例运行.bat批量处理文件进行重启不起作用
  10. 关于栈和堆的定量分析(★firecat推荐★)
  11. .NET WebAPI中使用Session使用
  12. 解决国内NPM安装依赖速度慢问题
  13. MySQL各版本解释和下载
  14. nginx 耗时原因定位总结
  15. Server2003+IIS6+TP-Link+花生壳配置
  16. 一个服务器多个tomcat的配置
  17. 就这么简单!构建强大的WebShell防护体系
  18. jwplayer视频--不兼容IE8
  19. MySQL Subquery
  20. 并查集实现Tarjan算法

热门文章

  1. bzoj 3450 DP
  2. jq 浏览器窗口大小发生变化时
  3. HashMap 、LinkedHashMap、HashTable、TreeMap 和 Properties 的区别
  4. inetdev_init &amp;&amp; inetdev_destroy
  5. linux===进程操作
  6. centos 引导盘
  7. python之operator操作符函数
  8. Lambda 表达式 in java 8
  9. Xcode7 iOS9.0 的真机调试
  10. python--数据持久化