hdu 4609 (FFT求解三角形)

[FFT] 例题详解 FFT是什么 FFT(Fast Fourier Transformation)就是“快速傅里叶变换”的意思,它是一种用来计算DFT(离散傅里叶变换)和IDFT(离散傅里叶反变换)的一种快速算法。这种算法运用了一种高深的数学方式、把原来复杂度为O(n2)的朴素多项式乘法转化为了O(nlogn)的算法。 FFT在算法竞赛中的例题 FFT能将多项式乘法O(n^2) 优化为 O(nlogn) 但是... 阅读详情

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 performance art, and begged the king to free them. Out of hatred to the real idiots, the king wanted to check if they were lying. The three men were sent to the king's forest, and each of them was asked to pick a branch one after another. If the three branches they bring back can form a triangle, their math ability would save them. Otherwise, they would be sent into jail.
However, the three men were exactly idiots, and what they would do is only to pick the branches randomly. Certainly, they couldn't pick the same branch - but the one with the same length as another is available. Given the lengths of all branches in the forest, determine the probability that they would be saved.
 

Input
An integer T(T≤100) will exist in the first line of input, indicating the number of test cases.
Each test case begins with the number of branches N(3≤N≤105).
The following line contains N integers a_i (1≤a_i≤105), which denotes the length of each branch, respectively.
 

Output
Output the probability that their branches can form a triangle, in accuracy of 7 decimal places.
 

Sample Input
2 4 1 3 3 4 4 2 3 3 4
 

Sample Output
0.5000000 1.0000000

题意:给你n个边,求从其中选出3个组成三角形的概率


思路:参考-kuangbin大神

如果我们用num[i]表示长度为i的木棍有多少个,对于1 3 3 4就是

num[] = {0 1 0 2 1}从卷积的公式来看

乘法第k位置上的值 便是a[i]*b[j](i + j == k),如果位置表示的是长度,num[]表示的个数,那么卷积过后我们得到的便是两边和的个数

{0 1 0 2 1}*{0 1 0 2 1} 卷积的结果应该是{0 0  1  0  4  2  4  4  1 }。

在求出了两条边的和后,枚举第三边


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps=1e-10;
const int inf = 0x3f3f3f;
const int MOD = 1e9+7;

const double PI = acos(-1.0);

struct Complex
{
    double x,y;
    Complex(double _x = 0.0,double _y = 0.0)
    {
        x = _x;
        y = _y;
    }
    Complex operator-(const Complex &b)const
    {
        return Complex(x-b.x,y-b.y);
    }
    Complex operator+(const Complex &b)const
    {
        return Complex(x+b.x,y+b.y);
    }
    Complex operator*(const Complex &b)const
    {
        return Complex(x*b.x-y*b.y,x*b.y+y*b.x);
    }
};

void change(Complex y[],int len)
{
    int i,j,k;
    for(i = 1,j = len/2; i < len-1; i++)
    {
        if(i < j) swap(y[i],y[j]);
        k = len/2;
        while(j >= k)
        {
            j-=k;
            k/=2;
        }
        if(j < k) j+=k;
    }
}

void fft(Complex y[],int len,int on)
{
    change(y,len);
    for(int h = 2; h <= len; h <<= 1)
    {
        Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
        for(int j = 0; j < len; j+=h)
        {
            Complex w(1,0);
            for(int k = j; k < j+h/2; k++)
            {
                Complex u = y[k];
                Complex t = w*y[k+h/2];
                y[k] = u+ t;
                y[k+h/2] = u-t;
                w = w*wn;
            }
        }
    }
    if(on == -1)
    {
        for(int i = 0; i < len; i++)
            y[i].x /= len;
    }
}

const int maxn = 401000;
Complex x1[maxn],x2[maxn];
ll sum[maxn];
ll num[maxn];
int a[maxn];

int main()
{
    int T;
    int n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int len = 1;
        int len1;
        memset(num,0,sizeof(num));
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&a[i]);
            num[a[i]]++;
        }
        sort(a,a+n);
        len1 = a[n-1] + 1;
        while(len < len1*2) len <<= 1;

        for(int i = 0; i < len1; i++)
            x1[i] = Complex(num[i],0);
        for(int i = len1; i < len; i++)
            x1[i] = Complex(0,0);

        fft(x1,len,1);
        //fft(x2,len,1);
        for(int i = 0; i < len; i++)
        {
            x1[i] =x1[i]*x1[i];
            //cout << x1[i].x << " "<< x1[i].y <<endl;
        }
        fft(x1,len,-1);
        for(int i = 0; i < len; i++)
        {
            sum[i] = (ll)(x1[i].x+0.5);
            //cout << sum[i] << endl;
        }
        len = a[n-1] * 2;
        for(int i = 0; i < n; i++) sum[a[i]+a[i]] --;
        for(int i = 1; i <= len; i++) sum[i] /= 2;
        for(int i = 1; i <= len; i++)
        {
            sum[i] += sum[i-1];
        }
        ll  tot = (ll)n*(n-1)*(n-2)/6;
        ll  ans = 0;

        for(int i = 0; i < n; i++)
        {
            ans += sum[len]-sum[a[i]];    //两边之和大于第三边

            ans -= (ll)(n-1-i) * i;      //一个比自己大,一个比自己小
            ans -= (n-1);                //取了自己
            ans -= (ll)(n-1-i)*(n-2-i)/2;    //都比自己大
        }
        //printf("%.7lf\n",(double)ans/tot);
        printf("%.7f\n",(double)ans/tot);
    }
    return 0;
}



NRF52832调试方法1——HardFault_Handler问题定位 一、遇到问题 keil debug模式下,直接点击全速运行(Run)发现程序卡死,点击stop按钮后,停到了HardFault_Handler位置,如下图所示。 此时使用navigate backwards(蓝色左箭头)是无效的,找不到程序卡在哪里。 二、解决办法 此时首先观察register窗口 若Stack为MSP,则复制R13(SP)的值到memory观察窗的地址搜索栏。每一行显示连续的28个地址上的存储信息,每个地址上存有一个字节。 从第21个位置起的连续四个字节是LR的值, 阅读详情

相关推荐

HC-05蓝牙模块详细配置、连接与使用过程

用手按着模块上的按键,再给蓝牙模块上电。当蓝牙模块上的灯慢闪的时候就说明进入了配置模式了。在配置蓝牙的时候一定要将串口助手按这个要求配置:设置波特率 38400,数据位 8 位,停止位 1 位,无校验位,这是固定操作! 根据蓝牙的主从模式进行不同的设置,二者主要区别就在于AT+ROLE这个指令如果这里没返回OK可能有一下几种情况:如果正常返回OK,那就可以进行下一步了 配置蓝牙密码的时候,特别是配置HC05,密码必须加双引号"",否则不能正常设置!!!! 给从机模式蓝牙配置好之后,将蓝牙重

qq_51688022的博客 2万+

【HDU - 4609 】3-idiots(FFT)

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 free them. Out of hatr...

Coldfresh的博客 332

用CentOS 7安装cadence搭建适合IC Design的科研环境(四)——IC617、MMSIM151、calibre2015安装过程step by step

以下操作都在root权限下执行。建立安装目录建议把这种大型软件装在/opt目录下。mkdir -p /opt/cadence/installscape mkdir -p /opt/mentor/Calibre2015其中-p参数是直接建立父目录。因为IC617和MMISM151会自己建立安装目录,所以在这里没有建相关目录。而calibre则是默认安装在安装包所在的目录下,所以需要提前建立。解压安

maxwell2ic的博客 7万+

[BZOJ 3513&HDU 4609][MUTC2013]idiots(FFT)

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 free them...

weixin_33721427的博客 180

AI时代,程序员何去何从?别慌,看完这篇你就明白了

AI时代程序员的发展方向 摘要:随着AI代码助手的普及,程序员行业面临变革。本文通过实际案例展示AI写代码的能力与局限:AI能生成基础功能代码(如RESTful API、数据处理脚本),但缺乏业务理解、系统设计和复杂逻辑处理能力。程序员的核心价值在于需求分析、架构设计、性能优化等高层能力。未来程序员应: 掌握AI工具提升效率 专注于创新和架构设计 培养业务理解能力 持续学习新技术 AI不会取代程序员,但会淘汰不会使用AI的程序员。建议开发者拥抱AI工具,将其作为助手而非威胁,聚焦高价值工作。

yunque_xianguang的博客 907

告别臃肿!保姆级教程:用NTLite深度精简Win10,打造你的专属纯净系统(附完整组件移除清单)

本文提供了一份详细的NTLite教程,帮助用户深度精简Windows10系统,移除冗余组件并优化性能。从准备工作到组件移除清单,再到系统配置优化和无人值守安装,逐步指导用户打造专属纯净系统。附完整组件移除清单和实战经验,确保系统稳定高效运行。

weixin_30945039的博客 852

3-idiots

题目 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 free them. Out of h...

扬弃 574

SWC_RTE01-AutoSAR架构【AutoSAR架构设计概述】

1 基于AutoSAR架构的概述 1.1架构层面:功能可以细分子功能,各个子功能需要交互。 -大功能可以通过Autosar组件Composition去表示; -各个子功能一般具有不可分割性,可以通过Autosar原子组件Component去表示; -各个子功能的交互可以通过接口去通信和交互; -各个子功能的行为可以通过内部行为去表示;具体表现为Runnable的设计;架构设计的时候不考虑具体的逻辑实现;只会关注Ruannble的触发事件或周期;数据访问的一致性问题;具体逻辑设计可通过模版c文件实现或通过基于

8450

HDU 4609 快速傅里叶变换

题目链接题意:已知n条边的长度,任取三条不同的边能够组成三角形的概率。很经典的FFT 如果已知任意两条边的和的情况,那么枚举第三条边可以在O(n)O(n)的复杂度下得出总方案数。难点便在于如果枚举两条边求和,其复杂度是不可承受的O(n2)O(n^2)考虑用FFT优化该过程。 构造多项式,xnx^n的系数是长度为n的边的条数。 类似于生成函数求方案数的思想。 该多项式与自身相乘便能得出任意两条

新熊君的博客 1089

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」1 CP的SOME/IP架构概览2 业务报文通信流3 服务发现通信和控制流 1 CP的SOME/IP架构概览 2 业务报文通信流 3 服务发现通信和控制流 点击返回雪云飞星的SOME/IP协议详解「总目录」 ...

雪云飞星的博客 6065

基于STM32设计的智能家居系统(采用ESP8266+OneNet云平台)

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 云平台: 采用中国移动OneNet. 也可以采用腾讯、阿里云、华为云、百度天工物接入、机智云等等。 前面文章有讲解。 协议: 采用MQTT协议 开发软件:keil5 完整项目源码下载:https://download.youkuaiyun.com/download/xiaolong1126626497/19766925 二、包含的硬件与实...

1万+

HDU 4609 3-idiots FFT

3-idiots 题目连接: 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 wa...

weixin_30481087的博客 71

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[HDU 4609]3-idiots(FFT+生成函数)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4609题目大意给出nn根木棍以及它们的长度,求取其中三根长度各不相同的木棍组成三角形的方案数。思路不妨设多项式A(x)A(x),其中xix^i前面的系数表示长度为ii的木棍个数。那么多项式A(x)2A(x)^2中xix^i前面的系数表示用两根木棍拼成长度为ii的木棍的方案数。 我们可以维护一个前缀和sum

某沙茶的OI代码库 1204

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HDU4609 FFT+组合计数

HDU4609 FFT+组合计数 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 找出n根木棍中取出三根木棍可以组成三角形的概率 题解: 我们统计每种长度的棍子的个数 我们对于长度就有一个多项式 \[ f=num[0]*i_0+num[1]*i_1+num[2]*i_2.....num[len]*i_len \] 我们考虑两根棍子可以组...

buerdepepeqi的优快云博客 323

2013 多校第一场 hdu 4609 3-idiots(FFT)

hdu 4609 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题目大意:给你 n 条边,问你任意三条边能组成三角形的概率。 思路:设 Ai 记录长度为 i 的边的个数,让它对自己本身做FFT,求出任意两条边能得到的和的数量。然后枚举第三条边,两边之和大于第三条边,第三条边指的是三条边中最长的边,所以还要 - (比它大的两条边的组合+一大

沉溺的专栏 1121

hdu 4609 3-idiots [FFT计数]【数学】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 ———————————————————–. 3-idiotsTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4437 Ac

Tabris的博客 659

HDU 4609 3-idiots FFT+计数问题

题目大意: 就是现在给出n个长度不超过100000的树枝 的长度, n 大致思路: 这个题还是很好的一道计数问题, 首先由于n 那么对于一个三角形, 考虑其最大的边, 首先将n根树枝排序, 然后从小到大一次考虑其作为组成的三角形中的最长边即可 对于第i根树枝最为最长边, 另外两条边的和需要大于第i根树枝的长度, 也就是之前处理出的A[i]~A[maxLength]的和, 然后

Gatevin的专栏 1920

hdu 4609 3-idiots —— FFT

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4609 算不合法的比较方便; 枚举最大的边,每种情况算了2次,而全排列算了6次,所以还要乘3; 注意枚举最大边的范围是 mx 而不是 lim !!否则会超过开的数组范围!!! 代码如下: #include<iostream> #include<cstdio>...

aodan5477的博客 135

hdu4609 3-idiots FFT

跟n条边,求任选三条边可以组成三角形的概率。求出n条边组成三角形的方案数,再除以C(n,3)就可以了,所以这题转化成n条边求可组成的三角形数。 首先用一个数组num[i]记录长度为i的边出现了几次,之后求num的卷积,即可得到n条边中任取两条边的和的长度各出现了多少次,拿第一组样例来说 a[]={1 3 3 4}转化成num={0,1,0,2,1},{0,1,0,2,1}*{0,1,0,2,1

Broken Wings 844

HDU 4609 FFT

题意 传送门 HDU 4609 3-idiots 题解 NNN 个数中任取三个,求选择的数可以作为三角形边长的概率。对于三角形的判定条件,即 ai+aj>ak,ak≥aj,aia_i+a_j>a_k, a_k\geq a_j,a_iai​+aj​>ak​,ak​≥aj​,ai​。计数时还需考虑所选择的数互不相同。 令 A(x)=∑xaiA(x)=\sum x^{a_i}A(x)=∑xai​,简单起见写为 ∑x\sum x∑x,根据容斥原理,考虑相同项的数量,可以得到 (∑x)2=∑x2+2

neweryyy的博客 558

HDU - 4609 生成函数+FFT

3-idiots Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10462 Accepted Submission(s): 3554 Problem Description King OMeGa catched three me...

青烟绕指柔的博客 1842

HDU - 4609 ,3-idiots,FFT

HDU - 4609 ,3-idiots https://vjudge.net/problem/HDU-4609/origin 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 o...

xing_mo的博客 267
上一篇: hdu 1402 FFT(模板)
下一篇: poj 2417 && poj3243(Baby-Step Giant-Step)
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值