题面

要求组合的方法显然我们需要对桶卷积,即设$F(x)=\sum\limits_{i=1}^{maxx}x^{cnt[i]}$,然后我们初步的先把$F^2(x)$卷出来,表示选两条边。然后我们发现如果用“两边之和大于第三边”来求,那么小于这两条边的可能不是最长的,所以应该枚举大于这两条边的来容斥

注意题目中提到了不能选重复的,所以对于所有指数为偶数的项去重,还有题目要求是无序地选

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=,M=,K=4e5;
  7. const double pai=acos(-);
  8. struct cpx
  9. {
  10. double x,y;
  11. }a[N];
  12. cpx operator + (cpx a,cpx b)
  13. {
  14. return (cpx){a.x+b.x,a.y+b.y};
  15. }
  16. cpx operator - (cpx a,cpx b)
  17. {
  18. return (cpx){a.x-b.x,a.y-b.y};
  19. }
  20. cpx operator * (cpx a,cpx b)
  21. {
  22. double x1=a.x,x2=b.x,y1=a.y,y2=b.y;
  23. return (cpx){x1*x2-y1*y2,x1*y2+x2*y1};
  24. }
  25. long long cnt[N],tot,ans;
  26. int mem[N],rev[N],lgg[N];
  27. double Sin[M],Cos[M];
  28. int n,m,T,rd;
  29. int Round(double x)
  30. {
  31. return (int)(x+0.5);
  32. }
  33. void Prework()
  34. {
  35. scanf("%d",&T);
  36. for(int i=;i<=K;i++)
  37. lgg[i]=lgg[i>>]+;
  38. for(int i=;i<=;i++)
  39. Sin[i]=sin(*pai/(<<i)),Cos[i]=cos(*pai/(<<i));
  40. }
  41. void Trans(cpx *c,int t)
  42. {
  43. for(int i=;i<n;i++)
  44. if(rev[i]>i) swap(c[rev[i]],c[i]);
  45. for(int i=;i<=n;i<<=)
  46. {
  47. int len=i>>;
  48. cpx omg=(cpx){Cos[lgg[i]],Sin[lgg[i]]*t};
  49. for(int j=;j<n;j+=i)
  50. {
  51. cpx ori=(cpx){,},tmp;
  52. for(int k=j;k<j+len;k++,ori=ori*omg)
  53. tmp=ori*c[k+len],c[k+len]=c[k]-tmp,c[k]=c[k]+tmp;
  54. }
  55. }
  56. if(t==-) for(int i=;i<n;i++) c[i].x/=n;
  57. }
  58. int main()
  59. {
  60. Prework();
  61. while(T--)
  62. {
  63. scanf("%d",&n);
  64. memset(mem,,sizeof mem),m=;
  65. for(int i=;i<=n;i++)
  66. {
  67. scanf("%d",&rd);
  68. mem[rd]++,m=max(m,rd);
  69. }
  70. ans=tot=1ll*n*(n-)*(n-)/,n=; while(n<=m*) n<<=;
  71. for(int i=;i<n;i++) a[i].x=mem[i],a[i].y=;
  72. for(int i=;i<n;i++) rev[i]=(rev[i>>]>>)+(i&)*(n>>);
  73. Trans(a,);
  74. for(int i=;i<n;i++) a[i]=a[i]*a[i];
  75. Trans(a,-);
  76. for(int i=;i<=m;i++) cnt[i]=Round(a[i].x);
  77. for(int i=;i<=m;i++)
  78. {
  79. if(i%==) cnt[i]-=mem[i>>];
  80. cnt[i]>>=,cnt[i]+=cnt[i-];
  81. }
  82. for(int i=;i<=m;i++) ans-=cnt[i]*mem[i];
  83. printf("%.7f\n",(double)ans/tot);
  84. }
  85. return ;
  86. }

解题:HDU 4609 Three Idiots的更多相关文章

  1. 快速傅里叶变换应用之二 hdu 4609 3-idiots

    快速傅里叶变化有不同的应用场景,hdu4609就比较有意思.题目要求是给n个线段,随机从中选取三个,组成三角形的概率. 初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计 ...

  2. hdu 4609 3-idiots [fft 生成函数 计数]

    hdu 4609 3-idiots 题意: 给出\(A_i\),问随机选择一个三元子集,选择的数字构成三角形的三边长的概率. 一开始一直想直接做.... 先生成函数求选两个的方案(注意要减去两次选择同 ...

  3. hdu 4609 3-idiots <FFT>

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...

  4. hdu 4609 3-idiots

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 FFT  不会 找了个模板 代码: #include <iostream> #include ...

  5. HDU 4609 3-idiots(FFT)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...

  6. HDU 4609 FFT模板

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给你n个数,问任意取三边能够,构成三角形的概率为多少. 思路:使用FFT对所有长度的个数进行卷积(\ ...

  7. hdu 4609 3-idiots——FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 答案就是随便选三条边的方案 - 不合法的方案. 不合法的方案就是算出 x+y = k 的方案数 g[ ...

  8. hdu 4609 3-idiots —— FFT

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 算不合法的比较方便: 枚举最大的边,每种情况算了2次,而全排列算了6次,所以还要乘3: 注意枚举最大 ...

  9. FFT(快速傅里叶变换):HDU 4609 3-idiots

    3-idiots Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

随机推荐

  1. gcc 与 g++的区分较

    一:gcc与g++比较 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为 ...

  2. 在虚拟机上搭建物理机可访问的web服务(IIS)

    0x0 前言 安装webug4.0的时候突发奇想,想学下如何在虚拟机里搭建网站,然后让主机像访问互联网的网站一样访问虚拟机的网站,为以后渗透测试搭建环境做准备 0x1 虚拟机安装win2003[以防万 ...

  3. 方正 ignb路由器设置备份(自用笔记)

    192.168.15.96255.255.255.0192.168.15.1219.232.46.61219.141.136.10

  4. t团队项目计划

    团队的backlog: .用户登录网站后,可以选择是买或者卖, (1)买 点击链接,可以分类浏览商品信息,也可以按价钱筛选 (2)卖 点击链接,选择要挂出的商品种类,填写信息(名称.价格.数量等)接着 ...

  5. My Sql数据库设置环境变量和字符集

    一.踩坑背景 之前开发中一直用的是sql  server 数据库,最近接到公司一个老的项目,用的my sql数据库做的,功能做了一大部分,现在客户要求对原程序和数据库进行服务器的迁移工作.产品经理给出 ...

  6. java对文件的操作

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {     /**      * 以字节为单位读取文件,常用 ...

  7. Firefox插件开发学习总结

    2018.06.14 我们小组最初只准备开发运行在google上的知乎插件,但我们经过调研发现还有一大部分用户是使用的火狐浏览器,所以我们也准备制作火狐插件.以下是我学习了部分火狐插件制作知识后的总结 ...

  8. GC 年轻代 老年代 持久代

    转载自:http://www.cnblogs.com/yaoyuan23/p/5587548.html 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Gener ...

  9. 使用docker inspect获取数据卷信息时返回地址为空

    使用 docker inspect 命令查看容器挂载的volume的目录 $ sudo docker inspect --format "{{.Volumes}}" redis-m ...

  10. 定时任务中的备份不同的数据库中的所有的表,每个表使用单独的sql备份文件

    #! /bin/bash # 指定用户 USER=root # 指定密码 PASS=123456 # 指定主机地址 HOST=localhost # 指定备份的目录 BACKUP=/backup/sq ...