题目描述

给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率。

输入

第一行T(T<=100),表示数据组数。
接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个数表示a_i。
3≤N≤10^5,1≤a_i≤10^5

输出

T行,每行一个整数,四舍五入保留7位小数。

样例输入

2
4
1 3 3 4
4
2 3 3 4

样例输出

0.5000000
1.0000000

提示

T<=20

N<=100000

首先开一个桶就可以得到长度分别为[1,100000]的木棒个数,只要将桶自己与自己卷积FFT一下就能得到两个木棒组成的任意长度的方案数(注意去重)。三个木棒不合法的情况当且仅当两个木棒之和小于等于第三个木棒,对桶求一个后缀和(或对方案数求一个前缀和)即可。

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<cstdio>
  7. #include<bitset>
  8. #include<vector>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. #define ll long long
  13. using namespace std;
  14. const double pi=acos(-1.0);
  15. int n,T,x;
  16. ll t[400010];
  17. struct miku
  18. {
  19. double x,y;
  20. miku(double X=0,double Y=0){x=X,y=Y;}
  21. }f[400010];
  22. miku operator + (miku a,miku b){return miku(a.x+b.x,a.y+b.y);}
  23. miku operator - (miku a,miku b){return miku(a.x-b.x,a.y-b.y);}
  24. miku operator * (miku a,miku b){return miku(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  25. int l,r[400010];
  26. int a[100010];
  27. int mask;
  28. inline void DFT(miku *A)
  29. {
  30. for(int i=0;i<mask;i++)
  31. {
  32. if(i<r[i])
  33. {
  34. swap(A[i],A[r[i]]);
  35. }
  36. }
  37. for(int mid=1;mid<mask;mid<<=1)
  38. {
  39. miku id(cos(pi/mid),sin(pi/mid));
  40. for(int i=mid<<1,j=0;j<mask;j+=i)
  41. {
  42. miku w(1,0);
  43. for(int k=0;k<mid;k++,w=w*id)
  44. {
  45. miku x=A[j+k],y=w*A[j+k+mid];
  46. A[j+k]=x+y;
  47. A[j+k+mid]=x-y;
  48. }
  49. }
  50. }
  51. }
  52. inline void IDFT(miku *A)
  53. {
  54. for(int i=0;i<mask;i++)
  55. {
  56. if(i<r[i])
  57. {
  58. swap(A[i],A[r[i]]);
  59. }
  60. }
  61. for(int mid=1;mid<mask;mid<<=1)
  62. {
  63. miku id(cos(pi/mid),-1.0*sin(pi/mid));
  64. for(int i=mid<<1,j=0;j<mask;j+=i)
  65. {
  66. miku w(1,0);
  67. for(int k=0;k<mid;k++,w=w*id)
  68. {
  69. miku x=A[j+k],y=w*A[j+k+mid];
  70. A[j+k]=x+y;
  71. A[j+k+mid]=x-y;
  72. }
  73. }
  74. }
  75. }
  76. int main()
  77. {
  78. scanf("%d",&T);
  79. mask=1;
  80. l=0;
  81. while(mask<=200000)
  82. {
  83. mask<<=1;
  84. l++;
  85. }
  86. for(int i=0;i<mask;i++)
  87. {
  88. r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  89. }
  90. while(T--)
  91. {
  92. scanf("%d",&n);
  93. memset(t,0,sizeof(t));
  94. int mx=0;
  95. for(int i=0;i<mask;i++)
  96. {
  97. f[i]=0;
  98. }
  99. for(int i=1;i<=n;i++)
  100. {
  101. scanf("%d",&x);
  102. a[i]=x;
  103. f[x].x++;
  104. mx=max(mx,x);
  105. }
  106. DFT(f);
  107. for(int i=0;i<mask;i++)
  108. {
  109. f[i]=f[i]*f[i];
  110. }
  111. IDFT(f);
  112. for(int i=0;i<mask;i++)
  113. {
  114. f[i].x/=mask;
  115. }
  116. for(int i=1;i<=n;i++)
  117. {
  118. f[a[i]<<1].x--;
  119. }
  120. for(int i=1;i<=mx;i++)
  121. {
  122. t[i]=t[i-1]+(ll)(f[i].x/2+0.1);
  123. }
  124. ll ans=0;
  125. for(int i=1;i<=n;i++)
  126. {
  127. ans+=t[a[i]];
  128. }
  129. printf("%.7f\n",1-(1.0*ans/(1.0*n*(n-1)/2*(n-2)/3)));
  130. }
  131. }

BZOJ3513[MUTC2013]idiots——FFT+生成函数的更多相关文章

  1. bzoj 3513 [MUTC2013]idiots FFT 生成函数

    [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 806  Solved: 265[Submit][Status][Di ...

  2. bzoj 3513: [MUTC2013]idiots FFT

    bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...

  3. bzoj千题计划168:bzoj3513: [MUTC2013]idiots

    http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i ...

  4. 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)

    传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai​的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...

  5. bzoj 3513: [MUTC2013]idiots【生成函数+FFT】

    想了好长时间最后发现真是石乐志 第一反应就是两边之和大于第三边,但是这个东西必须要满足三次-- 任意的两边之和合通过生成函数套路+FFT求出来(记得去掉重复选取的),然后这任意两边之和大于任意第三边可 ...

  6. 【bzoj3513】[MUTC2013]idiots FFT

    题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...

  7. BZOJ3513: [MUTC2013]idiots

    Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数.接下来若干行描述T组数据,每组数据第一行是n ...

  8. [bzoj3513][MUTC2013]idiots_FFT

    idiots bzoj-3513 MUTC-2013 题目大意:给定$n$根木棍,问随机选择三根能构成三角形的概率. 注释:$1\le n\le 3\cdot 10^5$,$1\le a_i\le 1 ...

  9. BZOJ 3513: [MUTC2013]idiots

    3513: [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 476  Solved: 162[Submit][Stat ...

随机推荐

  1. Java性能优化之String字符串优化

    字符串是软件开发中最重要的对象之一.通常,字符串对象在内存中是占据了最大的空间块,因此如何高效地处理字符串,必将是提高整体性能的关键所在. 1.字符串对象及其特点 Java中八大基本数据类型没有Str ...

  2. JS判断当前设备是 PC IOS Andriod

    JS判断当前设备是 PC IOS Andriod <script > window.onload = function(){ var isPc = IsPC(); var isAndroi ...

  3. win 2008 R2 或以上版本,只有C盘情况下,PHP上传文件,显示不了解决办法

    主要问题:因为没权限 解决办法:给C:\Windows\Temp 加上IIS账户读写权限

  4. H5 audio标签

    37-audio标签 注意点: audio标签的使用和video标签的使用基本一样, video中能够使用的属性在audio标签中大部分都能够使用, 并且功能都一样 只不过有3个属性不能用, heig ...

  5. R语言绘制茎叶图

    与直方图相比,茎叶图更能细致的看出数据分布情况! 代码: > x<-c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75,+ 78, 79, 81, 8 ...

  6. 福州大学软件工程1816 | W班 第7次作业成绩排名

    写在前面 汇总成绩排名链接 1.作业链接 第七次作业--项目需求分析(团队) 2.评分准则 本次作业映射总分为100分+贡献度得分,由以下部分组成: 引言(5 points) . 用户场景(15 po ...

  7. JEECG框架中使用Flash版本Uploadify,在Chrome版本号70下无法启动的解决办法

    感谢文章:https://www.cnblogs.com/zinan/p/6902427.html 单独打开IFRAME中的页面 点击导航栏的<不安全> 再刷新单独IFRAME的页面,就可 ...

  8. API接口TOKEN设计

    首先需要知道API是什么?   API(Application Programming Interface)即应用程序接口.你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接 ...

  9. Linux基础命令和NAT技术

    yum    yellowdog updater,modified是一种用python写的基于rpm的管理工具 用于解决rpm包的依赖性 要安装编译工具 yum install gcc 库函数:静态库 ...

  10. findBugs安装

    点击“Help->InstallNew Software”,如下图所示: 2 接着如下图所示: 3 Name”输入“findBugs”,“Location”输入“http://findbugs. ...