快速傅里叶变换应用之二 hdu 4609 3-idiots

快速傅里叶变化有不同的应用场景,hdu4609就比较有意思。题目要求是给n个线段,随机从中选取三个,组成三角形的概率。

初始实在没发现这个怎么和FFT联系起来,后来看了下别人的题解才突然想起来:组合计数问题可以用多项式的卷积来解决。于是将给的数据进行卷积相乘,利用FFT即可求出三角形任意两条线段组合的可能数目。

然后遍历初始数据,将其作为最长边(这里一开始也没想明白,其实就是只要最长边大于短边之和,其他两个不等式也自然可以满足)。那么理论上说比它长的所有两边组合可能都可以。当然在这里要考虑三种特殊情况:(即在两边组合数目中减去这些情况)

1.这两个边有可能一个边比最长边长,一个边小于最长边

2.其中一个边就是要选的这个边

3.两个边其实都比最长边长,这种情况要除以二

 

PS:G++使用的是longlong类型,C++是_int64,好久没写忘记了。

longlong在代码中间乘的运算也要加上,否则还是会出错。

#include <iostream>
#include <cmath>
#include <algorithm> //spell!
#include <string.h>
#define MAXN 400040 
#define PI acos(-1.0)
using namespace std;struct complex  
{  double r,i;  complex(double real=0.0,double image=0.0)  {  r=real;  i=image;  }  //以下为三种虚数运算的定义   complex operator+(const complex o)  {  return complex(r+o.r,i+o.i);  }  complex operator-(const complex o)  {  return complex(r-o.r,i-o.i);  }  complex operator*(const complex o)  {  return complex(r*o.r-i*o.i,r*o.i+i*o.r);  }  
}x1[MAXN];void bitrev(complex *y,int l) //二进制平摊反转置换 O(logn)   
{  register int i,j,k;  for(i=1,j=l/2;i<l-1;i++)  {  if(i<j)  swap(y[i],y[j]); //交换互为下标反转的元素    //i<j保证只交换一次   k=l/2;  while(j>=k) //由最高位检索,遇1变0,遇0变1,跳出   
        {  j-=k;  k/=2;  }  if(j<k)  j+=k;  }  
}
void fft(complex *in,int n,int flag)
{int i,j,k;complex u,t;bitrev(in,n);for(int i=2;i<=n;i=i*2){complex wn(cos((2*PI*flag)/i),sin((2*PI*flag)/i));//初始化单位复根for(j=0;j<n;j=j+i){complex w(1,0);for(k=j;k<j+i/2;k++){u=in[k];t=w*in[k+i/2];in[k]=u+t;in[k+i/2]=u-t;w=w*wn;}}}if(flag==-1)for(int i=0;i<n;i++)in[i].r=in[i].r/n;
}int a[100003];
long long res[MAXN]; 
long long sum[MAXN];
long long num[MAXN];
int main() {int T;scanf("%d",&T);while(T--){int n,i;scanf("%d",&n);memset(res,0,sizeof(res));memset(sum,0,sizeof(sum));memset(num,0,sizeof(num));for(int j=0;j<n;j++){scanf("%d",&a[j]);num[a[j]]++;}sort(a,a+n);for(i = 0;i <=a[n-1];i++){x1[i].r=num[i];x1[i].i=0;}int expandn=1;while(expandn<2*(a[n-1]+1))expandn=expandn*2;for(i = a[n-1]+1;i<expandn;i++){x1[i].r=0;x1[i].i=0;}fft(x1,expandn,1);for(i=0;i<expandn;i++)x1[i]=x1[i]*x1[i];fft(x1,expandn,-1);for(i=0;i<expandn;i++){res[i]=(long long)(x1[i].r+0.5);}//去除本身for(i=0;i<n;i++)res[a[i]+a[i]]--;//变为组合for(i=0;i<expandn;i++)res[i]=res[i]/2;//求出两边之和为i的所有可能//expandn=(a[n-1]+1)*2;sum[0]=res[0];for(i=1;i<expandn;i++)sum[i]=res[i]+sum[i-1];long long ans=0;for(i=0;i<n;i++){ans+=sum[expandn-1]-sum[a[i]];//比长度为a[i]大的所有可能//去除一个大于a[i],一个小于a[i]ans=ans-(long long)(n-1-i)*i;//去除一个取自己ans=ans-(n-1);//去除取两个都大ans=ans-(long long)(n-1-i)*(n-2-i)/2;}long long  all = (long long)n*(n-1)*(n-2)/6;printf("%.7lf\n",(double)ans/all);}
}
hdu 4609

 

转载于:https://www.cnblogs.com/holyprince/p/3596861.html

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

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

相关文章

PyCharm pyqt5用label控件显示图片 QPixmap 串口通信指示灯

import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtGui import QPixmap import SerialCommunication # module SerialCommunication.py# myPyMainForm # 主窗口对象 # labIndicator # label控件对象# 以下是代码片段# 获取“串口指示灯亮”图…

Create view failed with ORA-01031:insufficient privileges

有时候在ORACLE数据库创建视图时会遇到:ORA-01031:insufficient privileges错误,我也多次碰到了各种创建视图出错的情况&#xff0c;很多时候也没有太在意&#xff0c;今天被一同事问起这个问题&#xff0c;顺便总结一下出错的各种场景。 场景1&#xff1a;使用sys或system账号…

基于sympy的python实现三层BP神经网络算法

#!/usr/bin/python # -*- coding: utf-8 -*- """ 写一个三层的BP神经网络&#xff08;3&#xff0c;2&#xff0c;1&#xff09;,3是输入数据的维度&#xff0c;隐层设置节点数为2&#xff0c;1是因为每个观测的target都是一个标量即只有一个数&#xff1b; 1.随…

JVM(二)Java虚拟机组成详解

导读&#xff1a;详细而深入的总结&#xff0c;是对知识“豁然开朗”之后的“刻骨铭心”&#xff0c;想忘记都难。 Java虚拟机&#xff08;Java Virtual Machine&#xff09;下文简称jvm&#xff0c;上一篇我们对jvm有了大体的认识&#xff0c;进入本文之后我们将具体而详细的…

PyCharm pyqt5 python串口通信封装类SerialCommunication

""" pyqt5串口通信文件SerialCommunication.py """ import binascii import os import serial import serial.tools.list_ports from PyQt5.QtGui import QPixmap# 全局变量&#xff0c;串口是否创建成功标志 Ret False # 串口列表串口号 port_…

InstallShield 杀掉进程

将运行中进程杀掉:卸载时使用&#xff08;调用CMD命令&#xff09;:szApplicationPath WINSYSDIR^"taskkill.exe "; szApplicationCmdLine "APP.exe"; LongPathToQuote( szApplicationPath, TRUE ); szCmdLine szApplicationPath …

Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据

文章目录 1. Xposed安装2. JustTrustMe安装3. 确保Fiddler在模拟器里配置 此文只是针对Fiddler抓取APP数据失败情况下的方案&#xff0c;主要想解决的是安卓手机APP抓包HTTPS报文通过MITM代理后证书不被信任的问题。网上搜索出这是使用了SSL Pinning技术&#xff0c;网上可以搜…

互动直播的视频录制与合成—支持多人离线重入

实现的效果图&#xff1a; 上图合成了2个人视频&#xff0c;中途有1个人先离开之后又重新加入了房间。 一、业务场景 业务场景是这样的&#xff1a;多个用户&#xff08;2-4人&#xff09;直播的视频&#xff0c;合成为一个视频&#xff0c;这期间要满足2个条件&#xff1a;首…

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)

前言 以前制作一个Python窗体界面&#xff0c;我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的&#xff0c;今天朋友问我有没有Python窗体的设计工具&#xff0c;“用鼠标拖拖”就能完成窗体设计&#xff0c;我查了查相关资料&#xff0c;果然有一款好用的工具——Qt De…

JVM(三)对象的生死判定和算法详解

好的文章是能把各个知识点&#xff0c;通过逻辑关系串连起来&#xff0c;让人豁然开朗的同时又记忆深刻。 导读&#xff1a;对象除了生死之外&#xff0c;还有其他状态吗&#xff1f;对象真正的死亡&#xff0c;难道只经历一次简单的判定&#xff1f;如何在垂死的边缘“拯救”一…

【STM32】修改芯片型号后报 Error 的解决方案

原文&#xff1a;https://blog.csdn.net/xiuhua_wu/article/details/85237418 背景 前几天有个新需求&#xff0c;使用 STM32 的标准库&#xff08;STD&#xff09;做个产品的例程。之前已经做了个 HAL 的&#xff0c;但人家客户不干&#xff0c;非要 STD 的。拖了一周&#xf…

系统什么时候会执行adapter的getview函数

listview是一个特殊的控件&#xff0c;他需要的item是由对应的adapter来生成&#xff0c;但是它显示到界面上是和其他的是一样的也就是说getview()一般会在&#xff0c;第一次显示&#xff0c;页面刷新&#xff0c;或者当adapter对应的数据源变化时候会主动调用&#xff0c;not…

Python手写神经网络实现3层感知机

一、BP神经网络结构模型 BP算法的基本思想是&#xff0c;学习过程由信号的正向传播和误差的反向传播俩个过程组成&#xff0c;输入从输入层输入&#xff0c;经隐层处理以后&#xff0c;传向输出层。如果输出层的实际输出和期望输出不符合&#xff0c;就进入误差的反向传…

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字&#xff0c;读完大约需要 6 分钟。 上一篇我们讲了垃圾标记的一些实现细节和经典算法&#xff0c;而本文将系统的讲解一下垃圾回收的经典算法&#xff0c;和Hotspot虚拟机执行垃圾回收的一些实现细节&#xff0c;比如安全点和安全区域等。 因为各个平台的虚拟…

Linux(Ubuntu20.10)安装GIMP

原文&#xff1a;https://www.cnblogs.com/carious/p/10716647.html GIMP 名称由GNU Image Manipulation Program&#xff08;GNU图像处理程序&#xff09;的首字母组成&#xff09;是一个自由及开放原始码的点阵图图像编辑器&#xff0c;用于图像照片润饰及编辑、自由绘图、…

MRC和ARC混编

iOS5.0以后就开始可以使用ARC&#xff08;Automatic Reference Counting&#xff1a;自动引用计数&#xff09;来代替之前的MRC&#xff08;Manual Reference Counting&#xff1a;人工引用计数&#xff09;。使用ARC会减少很多代码和忘了释放对象的苦恼。但是事情都有两面性。…

python-cx_oracle报错“DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: “

问题的主要原因是python-cx_oracle加载的是32位的instantclient-basic&#xff0c;我们需要让他读到64位的。 弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1…

JVM(五)垃圾回收器的前世今生

全文共 2195 个字&#xff0c;读完大约需要 8 分钟。 如果垃圾回收的算法属于内存回收的方法论的话&#xff0c;那本文讨论的垃圾回收器就属于内存回收的具体实现。 因为不同的厂商&#xff08;IBM、Oracle&#xff09;&#xff0c;实现的垃圾回收器各不相同&#xff0c;而本文…

【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测

目录 一&#xff0c;准备 1.1代码1.2 环境准备1.3 搭建镜像1.4 配置slowfast环境1.5 ava.json1.6 SLOWFAST_32x2_R101_50_50.yaml1.7 SLOWFAST_32x2_R101_50_50 .pkl二&#xff0c;代码运行三 错误解决复现过程视频&#xff1a;B站复现视频复现结果 一&#xff0c;准备 1.1代…

十二、ubuntu20.10(Linux)下Pycharm配置pyqt5开发环境

Introduction PyQt是Python语言的GUI编程解决方案之一。可以用来代替Python内置的Tkinter。其它替代者还有PyGTK、wxPython等。与Qt一样,PyQt是一个自由软件。 在Linux下使用pycharm写python是最舒服的。本文介绍了Linux下pycharm qt5开发环境的配置。 0.安装python3 ubunt…