【题解】MUTC2013idiots
我是先知道的这题是FFT然后再做的,知道是FFT其实就是个套路题啦。首先,我们容易发现
\(P = \frac{a}{b}\) 其中a表示合法的方案数,而b表示全部的方案数。
b的值即为\(C\left ( n,3 \right )\)。如何求出合法的方案数呢?先考虑一下:如果我们锁定最大的边,那么合法的方案数就是所有两根木棍长度之和大于这根木棍的方案数。可是这个不好求啊。因为如果要统计方案数,那就一要保证这根木棍不出现在统计的方案中,而要保证方案中出现的两根木棍长度均<=这根木棍的长度,但这是不好做到的(等于是每一根木棍条件不同,复杂度根本无法保证)。
我们换一个角度:正难则反。不合法的方案数即为两根木棍之和<=这根木棍长度的方案数。这个是好求的,因为<=时,一定满足这根木棍是最长木棍&这根木棍与其他木棍组成的方案不会出现在其中。我们就可以用FFT快速求出卷积,算出两根木棍之和为x的方案数啦。
可是这题我找了很多程序对拍没有问题,但bzoj上过不去……呜呜呜……所以就不放代码惹。
……还是放一下吧,如果有哪位小可爱知道我的程序出了什么问题万分感谢呀……(;д;)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 502000
#define int long long
#define db long double
const db Pi = acos(-1.0);
int T, n, L, S, LAST, len, ans, c[maxn];
int Rec[maxn], R[maxn], C[maxn];
int maxx; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} struct complex
{
db x, y;
complex (db xx = , db yy = ) { x = xx, y = yy; }
}g[maxn]; complex operator + (complex a, complex b) { return complex(a.x + b.x, a.y + b.y); }
complex operator - (complex a, complex b) { return complex(a.x - b.x, a.y - b.y); }
complex operator * (complex a, complex b) { return complex(a.x * b.x - a.y * b.y, (a.x * b.y + a.y * b.x)); } void FFT(complex *A, int opt)
{
for(int i = ; i < S; i ++)
if(i < R[i]) swap(A[i], A[R[i]]);
for(int mid = ; mid < S; mid <<= )
{
complex W(cos(Pi / mid), opt * sin(Pi / mid));
for(int r = mid << , j = ; j < S; j += r)
{
complex w(, );
for(int k = ; k < mid; k ++, w = w * W)
{
complex x = A[j + k], y = w * A[j + k + mid];
A[j + k] = x + y;
A[j + k + mid] = x - y;
}
}
}
} void init()
{
for(int i = ; i <= S; i ++)
g[i].x = g[i].y = ;
memset(Rec, , sizeof(Rec));
S = , maxx = , len = ans = ;
} void pre()
{
C[] = ;
for(int i = ; i < ; i ++)
C[i] = C[i - ] * i / (i - );
} signed main()
{
T = read();
pre();
while(T --)
{
init();
n = read();
for(int i = ; i <= n; i ++)
{
int x = read();
g[x].x += , Rec[x] += ;
maxx = max(x, maxx);
}
maxx *= ;
while(S <= maxx) S <<= , len ++;
for(int i = LAST; i < S; i ++)
R[i] = ((R[i >> ] >> ) | ((i & ) << (len - )));
LAST = max(LAST, S - );
FFT(g, );
for(int i = ; i < S; i ++) g[i] = g[i] * g[i];
FFT(g, -);
for(int i = ; i <= maxx; i ++) g[i].x /= S;
for(int i = ; i <= maxx; i ++)
{
int x = (int) (g[i].x + 0.5);
if(!(i % )) x -= Rec[i / ];
x /= ; g[i].x = x;
if(i != ) g[i].x += g[i - ].x;
}
for(int i = ; i <= maxx / ; i ++)
ans += ((int) g[i].x) * Rec[i];
printf("%.7Lf\n", (db) (C[n] - ans) / (db) C[n]);
}
return ;
}
【题解】MUTC2013idiots的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Windows之cmd指令
gpedit.msc-----本地计算机策略sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff------- ...
- Mysql错误积累001-load data导入文件数据出现1290错误
错误出现情景 在cmd中使用mysql命令,学生信息表添加数据.使用load data方式简单批量导入数据. 准备好文本数据: xueshengxinxi.txt 文件 数据之间以tab键进行分割 ...
- 日志管理——rsyslog
官方文档(必看) http://www.rsyslog.com/doc/v8-stable/ 简介 rsyslog是linux自带日志管理工具,分为客户端\服务端,包含日志收集\过滤\分析\转储. 数 ...
- python3 练习题100例 (十一)
题目十一:举例证明角谷猜想:以一个正整数N为例,如果N为偶数,就将它变为N/2,如果除后变为奇数,则将它乘3加1(即3N+1).不断重复这样的运算,经过有限步后,一定可以得到1. #!/usr/bin ...
- vue笔记 介绍及安装 一
Vue.js 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层, ...
- echarts实用小技巧,控制字符串长度,限定整数等
限定横坐标文本字符长度 xAxis : [ axisLabel:{ formatter: function (value) { var maxlength=6; if (value.length> ...
- python基础之进程间通信、进程池、协程
进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...
- php复制目录很浪
一不小心搞出个超级深层次文件夹 主要是因为懒,在网上随便找了段复制文件夹的代码贴上了,结果是很恐怖,一个文件夹复制到他自身里面的时候,将会产生循环嵌套文件夹,后果是,windows因为文件名太长而无法 ...
- Android开发——View绘制过程源码解析(二)
0. 前言 View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...
- 10-mongodb启动错误
1.error信息 python@ubuntu:~$ mongod --22T17:: I CONTROL [initandlisten] MongoDB starting : pid= port= ...