bzoj3513 [MUTC2013]idiots

Description

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

Input

第一行T(T<=20),表示数据组数。 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个数表示a_i。1<=a_i<=100000,N<=100000

Output

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

设a(x)表示长度x的木棒出现次数

b(x)表示选两根木棒(可重)长度之和为x的方案数

显然b(m)=Σ a(x)*a(m-x) x=0..m,可以用fft求

稍加处理即可得到合法方案数

#include<bits/stdc++.h>
int N,P;
const double pi=3.14159265358979323846;
int r[262144];
struct cplx{
    double a,b;
    inline cplx(double r=0,double i=0){a=r;b=i;}
    inline cplx operator+(cplx x){return cplx(a+x.a,b+x.b);}
    inline cplx operator-(cplx x){return cplx(a-x.a,b-x.b);}
    inline cplx operator*(cplx x){return cplx(a*x.a-b*x.b,a*x.b+b*x.a);}
}a[262144];
void dft(cplx*a,int t){
    for(int i=0;i<N;i++)if(i>r[i])std::swap(a[i],a[r[i]]);
    for(int i=1;i<N;i<<=1){
        cplx w(cos(pi/i),t*sin(pi/i));
        for(int j=0;j<N;j+=i<<1){
            cplx e(1,0),*b=a+j,*c=b+i;
            for(int k=0;k<i;k++,e=e*w){
                cplx x=b[k],y=c[k]*e;
                b[k]=x+y,c[k]=x-y;
            }
        }
    }
}
inline int input(){
    int x=0,c=getchar();
    while(c>57||c<48)c=getchar();
    while(c>47&&c<58)x=x*10+c-48,c=getchar();
    return x;
}
int t[262144];
double t2[262144];
int main(){
    int T=input();
    while(T--){
        int n=input();
        for(int i=0;i<=100000;i++)t[i]=0;
        int mx=2;
        for(int i=0;i<n;i++){
            int x=input();
            ++t[x];
            if(x>mx)mx=x;
        }
        for(N=2,P=0;N<=mx;N<<=1,++P);
        if(N<262144)N<<=1,++P;
        for(int i=1;i<N;i++)r[i]=r[i>>1]>>1|(i&1)<<P;
        for(int i=0;i<=mx;i++)a[i]=cplx(t[i],0);
        for(int i=mx+1;i<N;i++)a[i]=cplx(0,0);
        dft(a,1);
        for(int i=0;i<N;i++)a[i]=a[i]*a[i];
        dft(a,-1);
        for(int i=0;i<=mx;i++)t2[i]=a[i].a/N;
        for(int i=0;i<=mx>>1;i++)t2[i<<1]-=t[i];
        for(int i=1;i<=mx;i++)t2[i]+=t2[i-1];
        double c=0;
        for(int i=1;i<=mx;i++)c+=t2[i]*t[i];
        printf("%.7lf\n",1.0-c/(double(n)*(n-1)*(n-2)/3.0));
    }
    return 0;
}
时间: 2024-11-01 16:47:29

bzoj3513 [MUTC2013]idiots的相关文章

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

http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i 的方案数g[i] 线段长度>i的 线段数量 t[i] 答案是否可以表示为 Σ g[i]*t[i] ? 不能,因为 有c是最大的数的限制 去掉c是最大数的限制: 不能组成三角形的条件:a+b<=c 其中,a<c,b<c 在这里,满足条件的c一定是abc中最大的 所以解题思路是 求出不能

bzoj 3513: [MUTC2013]idiots -- FFT

3513: [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MB Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个数表示a_i. 3≤N≤10^5,1≤a_i≤10^5 Output T行,每行一个整数,四舍五入保留7位小数. Sample Input 2 4 1 3 3

【bzoj3513】[MUTC2013]idiots FFT

题目描述 给定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 题解 FFT 考虑什么样的3根木棍不能构成三角形:最长边大于等于其余两边之和. 因为长度只有$1

BZOJ 3513: [MUTC2013]idiots

Description 求一个序列能够成的三角形个数.\(n \leqslant 10^5,a_i \leqslant 10^5\) Sol FFT. 我们可以用FFT求出任意两个形成的组合,不过要减去重复的. 我先算的是排列,最后除6变成组合. 然后考虑将第三条边加入,这时候只需要减去所有小于等于这条边的长度的个数*3即可. 因为这样正确的原因是我假设的一个条件,假设的是我们选的这条边是最长边,这样减掉的边都会比他短,也就考虑了所有方案. 因为算的是排列,并且其他两个的顺序已经确定,有三个位置

【FFT】HDU4609-3 idiots

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<complex> 6 #include<cmath> 7 #define pi acos(-1) 8 using namespace std; 9 const int MAXN = 400040; 10 typedef complex<doubl

bzoj3513

fft 考虑什么情况下不能组成三角形,那么就是a+b<=c,我们用fft求出所有a+b的情况,对于每个c统计就行了 #include<bits/stdc++.h> using namespace std; #define pi acos(-1) const int N = 500005; int n, m, k; int A[N]; long long t[N], sum[N]; struct data { double a, b; data() { a = 0; b = 0; } da

[BZOJ2132] 圈地计划

Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 1350  Solved: 637[Submit][Status][Discuss] Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域.GDOI要求将这些区域分为商业区和工业区来开发.根据不同的地形环境,每块小区域建造商业

HDU4609 3-idiots

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description King OMeGa catched three men who had been streaking in the street. Looking as idiots though, the three men insisted that it was a kind of perform

HDU4609 3-idiots(母函数 + FFT)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4609 Description King OMeGa catched three men who had been streaking in the street. Looking as idiots though, the three men insisted that it was a kind of performance art, and begged the king to fre