HDU 4609 FFT

 题目大意

给定n条边的边值,求任意取三条边能组成三角形的概率

 

这里概率 P = valid/tot

tot = (n-2)*(n-1)*n/6是没问题的

valid表示合法的方式

先考虑,任意两条边组合形成方法的总数

因为边值在100000的范围内,这里组合用fft计算

得到最后形成和为 i 的两条边的方法数为 num[i]

这里计算后要记得减去取两条相同边的情况,还有 取 3,4 和 4,3是一样的,要记得除以2

最后跑个n的循环,每次将当前边作为排序后(主要是因为有长度相同的边才这么考虑)次序最大的边,然后保证得到的和是两条在它前面的边组成的

这个计算就需要求个总方法数的前缀和了

取到所有和大于当前边的方法数,减去由两条比它大的边组成的情况(n-i)*(n-i-1)/2,一个比他大一个比他小组成的(n-i)*(i-1),还有它其余任意一条边组成的(n-1)

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cmath>
  4 #include <iostream>
  5 #include <algorithm>
  6 using namespace std;
  7 #define N 100005
  8 #define ll long long
  9 const double PI = acos(-1.0);
 10 
 11 int n , a[N] , cnt[N] ;
 12 ll num[N<<2] , sum[N<<2];
 13 
 14 struct complex{
 15     double r , i;
 16     complex(double r=0 , double i=0):r(r),i(i){}
 17     complex operator+(const complex &a) const{
 18         return complex(r+a.r , i+a.i);
 19     }
 20     complex operator-(const complex &a) const{
 21         return complex(r-a.r , i-a.i);
 22     }
 23     complex operator*(const complex &a) const{
 24         return complex(r*a.r-i*a.i , r*a.i+i*a.r);
 25     }
 26 };
 27 
 28 void change(complex y[] , int len)
 29 {
 30     int i,j,k;
 31     for(i=1 , j=len/2 ; i<len-1 ; i++){
 32         if(i<j) swap(y[i],y[j]);
 33         k = len/2;
 34         while(j>=k){
 35             j-=k;
 36             k/=2;
 37         }
 38         if(j<k) j+=k;
 39     }
 40 }
 41 
 42 void fft(complex y[] , int len , int on)
 43 {
 44     change(y , len);
 45     for(int i=2 ; i<=len ; i<<=1){
 46         complex wn(cos(-on*2*PI/i) , sin(-on*2*PI/i));
 47         for(int j=0 ; j<len ; j+=i){
 48             complex w(1,0);
 49             for(int k=j ; k<j+i/2 ; k++){
 50                 complex u = y[k];
 51                 complex t = w*y[k+i/2];
 52                 y[k] = u+t;
 53                 y[k+i/2] = u-t;
 54                 w = w*wn;
 55             }
 56         }
 57     }
 58     if(on==-1)
 59         for(int i=0 ; i<len ; i++)
 60             y[i].r /= len;
 61 
 62 }
 63 complex x[N<<2];
 64 
 65 int main()
 66 {
 67    // freopen("a.in" , "r" , stdin);
 68     int T;
 69     scanf("%d" , &T);
 70     while(T--){
 71         scanf("%d" , &n);
 72         int mx = 0;
 73         memset(cnt , 0 , sizeof(cnt));
 74         for(int i=1 ; i<=n ; i++){
 75             scanf("%d" , &a[i]);
 76             cnt[a[i]]++ , mx=max(mx , a[i]);
 77         }
 78         int len = 1;
 79         while(len<2*(mx+1)) len<<=1;
 80         for(int i=0 ; i<=mx ; i++) x[i] = complex(cnt[i] , 0);
 81         for(int i=mx+1 ; i<len ; i++) x[i] = complex(0 , 0);
 82         fft(x , len , 1);
 83         for(int i=0 ; i<len ; i++)
 84             x[i] = x[i]*x[i];
 85         fft(x , len , -1);
 86         for(int i=0 ; i<len ; i++) num[i] = (ll)(x[i].r+0.5);
 87         for(int i=1 ; i<=n ; i++) num[a[i]+a[i]]--;
 88         for(int i=0 ; i<len ; i++){
 89             num[i]/=2;
 90             if(i) sum[i] = sum[i-1]+num[i];
 91         }
 92         ll ans = 0;
 93         sort(a+1 , a+n+1);
 94         for(int i=1 ; i<=n ; i++){
 95             ll val = sum[len-1]-sum[a[i]];
 96             val = val - (n-1);
 97             val = val - (ll)(n-i)*(i-1);
 98             val = val - (ll)(n-i)*(n-i-1)/2;
 99           //  cout<<i<<" "<<a[i]<<" "<<sum[len-1]-sum[a[i]]<<" "<<val<<endl;
100             ans = ans+val;
101         }
102         printf("%.7f\n" , ans*6.0/((ll)n*(n-1)*(n-2)));
103     }
104     return 0;
105 }

 

转载于:https://www.cnblogs.com/CSU3901130321/p/4910831.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《日志管理与分析权威指南》一2.3 良好日志记录的标准

本节书摘来华章计算机《日志管理与分析权威指南》一书中的第2章 &#xff0c;第2.3节&#xff0c;&#xff08;美&#xff09; Anton A. Chuvakin Kevin J. Schmidt Christopher Phillips 著 姚 军 简于涵 刘 晖 等译更多章节内容可以访问云栖社区“华章计算机”公众号查…

Python【01】【基础部分】- A

一、WHATS PYTHON ? 1、python 简介 Python&#xff08;英语发音&#xff1a;/ˈpaɪθən/&#xff09;, 是一种面向对象、解释型计算机程序设计语言&#xff0c;由Guido van Rossum于1989年发明&#xff0c;第一个公开发行版发行于1991年。Python是纯粹的自由软件&#xff0…

java的自增自减_Java中自增和自减操作符(++/--)的那些事

自增()和自减(--)运算符在JAVA语言中存在着很多运算符&#xff0c;但是在实际开发中我们或许很少用到它们&#xff0c;在初次学习中却时常出现它们的身影&#xff0c;对于这些运算符的含义和用法&#xff0c;是否还记得呢&#xff1f;1. 概述自增操作符()和自减操作符(--)是对变…

Finished yeah!

终于到了最后的博客阶段&#xff0c;这时候才知道博客此时此刻是多么的惬意&#xff0c;它成了书写心声的自由平台&#xff01;耗时一天完成这作业说起来也是蛮辛苦的&#xff0c;编译器需要新装&#xff0c;IDE需要熟悉&#xff0c;当然最主要的是之前浅入浅出的C功底在此次作…

《Python语言程序设计》——1.6 开始学习Python

本节书摘来自华章计算机《Python语言程序设计》一书中的第1章&#xff0c;第1.6节,作者&#xff1a;&#xff3b;美&#xff3d;梁勇&#xff08;Y. Daniel Liang&#xff09; 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.6 开始学习Python 关键点&#xff1a;…

Tomcat性能调优

1、集成apache 虽然Tomcat也可以作web服务器&#xff0c;但是处理静态html的速度比不上apache&#xff0c;且其作为web服务器的功能远不如Apache&#xff0c;因此把apache和tomcat集成起来&#xff0c;讲html和jsp功能部分进行明确的分工&#xff0c;让tomcat只处理jsp部分&…

【转】sip中的subscribe和notify扩展应用技术

http://blog.csdn.net/hwz119/article/details/3965322转载于:https://www.cnblogs.com/matthew-2013/p/4917207.html

再读《被神化的框架》

开发框架&#xff0c;构件&#xff0c;组件非常地多&#xff0c;而且&#xff0c;趋势是越来越多&#xff0c;特别是在java中。当然也不是说其它平台的少。而特别是框架越来越被神化了&#xff0c;似乎用之解决一切问题&#xff0c;不用就要敲坏键盘。对于老衲这样的打字员来说…

河南推出近万亿PPP投资计划 郑州实现智慧城市全覆盖

1 近万亿PPP项目启动 眼下&#xff0c;国内财经新闻的热点聚焦在PPP开发上&#xff0c;这与PPP支撑国内经济平衡运行的一支强劲力量正被政府看好。就连二级市场也出现了PPP概念的抢筹现象。 9月27日&#xff0c;股市再一次遭遇抛售&#xff0c;大盘创出阶段性新低&#xff0c;然…

java基础实例代码_Java基础实例

打印等腰三角形代码public class ForForTest{public static void main(String []args){for(int x0;x<5;x){for(int yx1;y<5;y){System.out.print(" ");}for(int z0;zSystem.out.print("* ");}System.out.println();}}}折半查找代码&#xff1a;//练习…

###《Effective STL》--Chapter3

点击查看Evernote原文。 #author: gr #date: 2014-09-13 #email: forgeruigmail.com Chapter3 关联容器 Topic 22: 切勿直接修改set或multiset中的键 修改元素的值可以通过下面五步操作&#xff0c;避免作类型转换。 struct IDNumberLess : public binary…

如何获取网络资源?

# encodingutf-8 #python 2.7.10 #xiaodeng #如何获取网络资源&#xff1f; #HTTP权威指南 26页#url就是因特网资源的标准化名称&#xff0c;他指向每一条电子信息&#xff0c;告诉你他们位于何处&#xff0c;以及如何与之交互。 #URL是浏览器寻找信息时所需的资源位置。 #一个…

Loadrunner多服务器连接问题

今天用想增加一个压力机,在服务器管理列表里怎么也连不上,后来解决方法如下:1. 关闭所有loadrunner组件,并手动结束lr_开头的进程2.找到惠普loadrunner安装目录(C:\Program Files\HP\LoadRunner\bin),手动运行magentproc.exe即可最新内容请见作者的GitHub页&#xff1a;http://…

java 常量存储_JAVA 存储空间 寄存器 堆栈 堆 常量存储 非RAM存储

&#xff11;.寄存器这是最快的存储区&#xff0c;因为它位于处理器内部&#xff0c;数量极其有限&#xff0c;所以寄存器根据需求进行分配&#xff0c;你不能直接控制&#xff0c;也不能在程序中感 觉到寄存器存在的任何迹象。2.堆栈位于通用RAM(随机访问存储器)中&#xff0…

物联网安防技术融合在细分领域的应用分析

物联网的核心是业务和应用的创新。物联网技术与智能化技术的深度融合&#xff0c;加快了行业的智能化发展&#xff0c;促使了行业需求在应用层上的落地。安防技术架构是物联网架构的一个子集&#xff0c;传统安防是一个相对保守的行业。现代安防和物联网在业务和技术上的融合发…

一个强大的工具来模拟数百万​​并发用户负载测试:Gryphon

Gryphon是由网易自主研发的能够模拟千万级别并发用户的一个软件&#xff0c;目的是能够用较少的资源来模拟出大量并发用户&#xff0c;并且能够更加真实地进行压力测试&#xff0c; 以解决网络消息推送服务方面的压力测试的问题和传统压力测试的问题。Gryphon分为两个程序&…

java 反射与泛型_Java基础系列 - 泛型和反射机制

package com.test5;import java.lang.reflect.Field;import java.lang.reflect.Method;/*** Java泛型和反射机制(泛型的好处 代码安全简单&#xff0c;自动装箱拆箱&#xff0c;提高代码的重用率)*/public class test5 {public static void main(String[] args) {Employer empl…

Linux环境下的Popush部署——张凯

完成情况&#xff1a; 已按照相关部署文档完成了所有任务&#xff0c;包括软件包的安装与配置&#xff0c;以及对各种开发语言的支持&#xff0c;以及gdb的调试功能的支持 遇到的主要问题&#xff1a; 由于从大二以来我基本上所有的开发工作都是在Linux下做的&#xff0c;因此对…

【c++】标准模板库STL入门简介与常见用法

一、STL简介 1、什么是STL STL&#xff08;Standard Template Library&#xff09;标准模板库&#xff0c;主要由容器、迭代器、算法、函数对象、内存分配器和适配器六大部分组成。STL已是标准C的一部分&#xff0c;使用STL开发系统可以提高开发效率。 2、容器&#xff08;Cont…

强连通分量(学习心得)

定义&#xff1a;有向图强连通分量&#xff1a;在有向图G中&#xff0c;如果两个顶点vi,vj间&#xff08;vi>vj&#xff09;有一条从vi到vj的有向路径&#xff0c;同时还有一条从vj到vi的有向路径&#xff0c;则称两个顶点强连通如果有向图G的每两个顶点都强连通&#xff0c…