1 条题解

  • 0
    @ 2026-2-26 9:25:31
    #include<bits/stdc++.h>
    #define int ll
    using namespace std;
    typedef long long ll;
    const double pi=acos(-1.0);
    int r[2000010];
    void FFT(complex<double> a[],ll n,int op){
    	for(int i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
    	for(int m=2;m<=n;m<<=1){
    		complex<double> w1={cos(2*pi/m),sin(2*pi/m)*op};
    		for(int i=0;i<n;i+=m){
    			complex<double> wk={1,0};
    			for(int j=0;j<m/2;j++){
    				complex<double> x=a[i+j],y=a[i+j+m/2]*wk;
    				a[i+j]=x+y;a[i+j+m/2]=x-y;
    				wk=wk*w1;
    			}
    		}
    	}
    }
    complex<double> a[2000010];
    ll tt[2000010],b[2000010],A[2000010];
    signed main(){
    	int t;
    	cin>>t;
    	while(t--){
    		ll n;
    		cin>>n;
    		ll mx=0;
    		for(int i=0;i<n;i++){
    			cin>>A[i];
    			tt[A[i]]++;
    			mx=max(mx,A[i]);
    		}
    		ll m=1;
    		while(m<mx+mx+1)m<<=1;
    		for(int i=0;i<m;i++)r[i]=r[i/2]/2+(i&1)*m/2;
    		for(int i=0;i<m;i++)a[i]={tt[i],0};
    		FFT(a,m,1);
    		for(int i=0;i<m;i++){
    			a[i]=a[i]*a[i];
    		}
    		FFT(a,m,-1);
    		for(int i=0;i<m;i++){
    			b[i]=(ll)(a[i].real()/m+0.5);
    		}
    		for(int i=0;i<n;i++)b[2*A[i]]--;
    		for(int i=0;i<m;i++)b[i]/=2;
    		for(int i=1;i<m;i++){
    			b[i]=b[i-1]+b[i];
    		}
    		double ans=0,c=n*(n-1)*(n-2)/6.0;
    		for(int i=0;i<n;i++){
    			ans+=b[A[i]];
    		}
    		ans=1.0-ans/c;
    		printf("%.7lf\n",ans); 
    		for(int i=0;i<=m;i++)tt[i]=0;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    5178
    时间
    5000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    33
    已通过
    5
    上传者