题目传送门

分析:

FFT一手统计两根棍子相加的方案

然后一个值2S可能会被同一根S自己乘自己得到

然后要减去

其次,A+B和B+A会被算成两种方案,所以还要除以2

然后不太好算合法的方案数,但是非法的很好算

直接减去小于S的所有方案数乘以长度为S的棍子数就好了。。

疯狂卡常2333

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<algorithm>
  5.  
  6. #define maxn 500005
  7.  
  8. using namespace std;
  9.  
  10. inline int getint()
  11. {
  12. int num=,flag=;char c;
  13. while((c=getchar())<''||c>'')if(c=='-')flag=-;
  14. while(c>=''&&c<='')num=num*+c-,c=getchar();
  15. return num*flag;
  16. }
  17.  
  18. struct cp{
  19. double a,b;
  20. cp(){}
  21. cp(double x,double y){a=x,b=y;}
  22. friend cp operator +(cp x,cp y)
  23. {return cp(x.a+y.a,x.b+y.b);}
  24. friend cp operator -(cp x,cp y)
  25. {return cp(x.a-y.a,x.b-y.b);}
  26. friend cp operator *(cp x,cp y)
  27. {return cp(x.a*y.a-x.b*y.b,x.a*y.b+x.b*y.a);}
  28. };
  29.  
  30. const double pi=acos(-1.0);
  31. int k=,bit;
  32. cp a[maxn],b[maxn];
  33. int rev[maxn];
  34. long long num1[maxn],num2[maxn];
  35.  
  36. inline void fft(cp *a,int inv)
  37. {
  38. for(int i=;i<k;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
  39. for(int mid=;mid<k;mid<<=)
  40. {
  41. cp tmp(cos(pi/mid),inv*sin(pi/mid));
  42. for(int i=;i<k;i+=mid*)
  43. {
  44. cp ret(,);
  45. for(int j=;j<mid;j++,ret=ret*tmp)
  46. {
  47. cp x=a[i+j],y=ret*a[i+j+mid];
  48. a[i+j]=x+y,a[i+j+mid]=x-y;
  49. }
  50. }
  51. }
  52. }
  53.  
  54. int main()
  55. {
  56. int T=getint();
  57. while(T--)
  58. {
  59. memset(a,,sizeof a);
  60. int mx=;
  61. long long n=getint();k=,bit=;
  62. for(int i=;i<n;i++)
  63. {
  64. int x=getint();mx=max(mx,x);
  65. a[x].a++;
  66. }
  67. while(k<(mx+)*-)k<<=;
  68. while((<<bit)<k)bit++;
  69. for(int i=;i<k;i++)rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
  70. for(int i=;i<k;i++)b[i]=a[i];
  71. fft(a,);
  72. for(int i=;i<k;i++)a[i]=a[i]*a[i];
  73. fft(a,-);
  74. for(int i=;i<k;i++)
  75. {
  76. num1[i]=(long long)(b[i].a+0.5),
  77. num2[i]=(long long)(a[i].a/k+0.5);
  78. if(!(i&))num2[i]-=num1[i>>];
  79. num2[i]>>=;
  80. }
  81. long long ans=(1ll*n*(n-)*(n-))/;
  82. for(int i=;i<=mx;i++)num2[i]+=num2[i-],ans-=num2[i]*num1[i];
  83. printf("%.7lf\n",1.0*ans*/(n*(n-)*(n-)));
  84. }
  85. }

BZOJ 3513 idiots的更多相关文章

  1. bzoj 3513: [MUTC2013]idiots FFT

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

  2. BZOJ 3513: [MUTC2013]idiots

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

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

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

  4. 【刷题】BZOJ 3513 [MUTC2013]idiots

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

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

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

  6. Fast Fourier Transform

    写在前面的.. 感觉自己是应该学点新东西了.. 所以就挖个大坑,去学FFT了.. FFT是个啥? 挖个大坑,以后再补.. 推荐去看黑书<算法导论>,讲的很详细 例题选讲 1.UOJ #34 ...

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

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

  8. 【BZOJ】【2132】圈地计划

    网络流/最小割 Orz Hzwer 这类大概是最小割建模中的经典应用吧…… 黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了…… /****************************** ...

  9. 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...

随机推荐

  1. vue-learning:26 - component - 组件三大API之一:prop

    组件三大API之一: prop prop的大小写 prop接收类型 字符串数组形式 对象形式: type / required / default / validator prop传递类型: 静态传递 ...

  2. Educational Codeforces Round 61

    Educational Codeforces Round 61 今早刚刚说我适合打pikmike出的EDU 然后我就挂了 A 不管 B 不管 C 这道题到快结束了才调出来 大概就是\(n^2\)枚举不 ...

  3. Codeforces 293E 点分治+cdq

    Codeforces 293E 传送门:https://codeforces.com/contest/293/problem/E 题意: 给你一颗边权一开始为0的树,然后给你n-1次操作,每次给边加上 ...

  4. Servlet 常用类

    Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务.同时为了方便开发,servlet标准中也提供了许多常用的 ...

  5. Android生命周期函数执行顺序

    转载自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常启动:onCreate()->onStart()->on ...

  6. hexo+github搭建博客(超级详细版,精细入微)

    # 前言 你了解[Hexo]( https://hexo.io/zh-cn/ "Hexo官网")吗? Hexo是一个静态博客框架,基于Node.js,将Markdown文章通过渲染 ...

  7. JDK源码那些事儿之浅析Thread上篇

    JAVA中多线程的操作对于初学者而言是比较难理解的,其实联想到底层操作系统时我们可能会稍微明白些,对于程序而言最终都是硬件上运行二进制指令,然而,这些又太过底层,今天来看一下JAVA中的线程,浅析JD ...

  8. saltstack的配置配置

    一.为不同的环境设置不同的文件目录 1.1 修改配置文件 /etc/salt/master [root@node1 salt]# vim /etc/salt/master file_roots: ba ...

  9. 修改kubelet启动参数

    我是用kubeadm安装的k8s,现在通过Aqua扫描出相关配置问题,需要修改kubelet的启动参数: 默认配置文件名为:10-kubeadm.conf #vim /usr/lib/systemd/ ...

  10. 开箱即用~基于.NET Core的统一应用逻辑分层框架设计

    目前公司系统多个应用分层结构各不相同,给运维和未来的开发带来了巨大的成本,分层架构看似很简单,但保证整个研发中心都使用统一的分层架构就不容易了. 那么如何保证整个研发中心都使用统一的分层架构,以达到提 ...