之后对所有线段a[i]有大到小排列,考虑第i条线段是三角形最长边的情况(长度相同则将编号大的视为更长,就没有长度相同的情况了。实际计算时无影响)。首先是sum[i + 1] + sum[i + 2] + ... + sum[len - 1],即其他两边之和要大于他的方案数。然后去掉:1.另两边有一条比他大,有一条比他小。 2...
longlong在代码中间乘的运算也要加上,否则还是会出错。 hdu 4609
所以我们对num数组求一次FFT 两根棍子组成长度的上界是\(len_{max}*2\) 可能存在棍子重复组合的情况,这个时候我们需要去重 去掉两种重复的情况 1.自己和自己组合 即去除a[i]+a[i]的情况 2.A和B组合 B又和A组合的情况 这种时候每个组合/2即可 然后通过组合数计数即可,tips:在过程中可能爆int 代码: #includ...
然后统计答案的时候,注意把不合法的减了。 #include<bits/stdc++.h> usingnamespacestd; #pragma warning(disable:4996) constdoublePI=acos(-1.0); structComplex { doubler,i; Complex(double_r=0,double_i=0) { r=_r;i=_i; } Complexoperator+(constComplex&b) { returnComplex(r+b.r,i+b.i);...
HDU-4609(FFT/NTT) 题意: 给出n个木棒,现从中不重复地选出3根来,求能拼出三角形的概率。 计算合法概率容易出现重复,所以建议计算不合法方案数 枚举选出的最大边是哪条,然后考虑剩下两条边之和小于等于它 两条边之和为xx的方案数可以FFT/NTTFFT/NTT得到,是一个简单的构造 ...
HDU - 4609 3-idiots (FFT) 题意:给你一堆线段的长度,求任选三条能组成三角形的概率。 解法:先求出任选两条能组成的所有长度及其数量,这个过程可以用FFT实现。设a[i]代表长度为i的线段的数量,数组b为数组a的平方,然后从b中减去每条线段自己的贡献,即b[i*2]-=a[i],然后对所有的b[i]除以2,则b[i]...
hdu 4609-fft多项式 解题思路:假设三角形最长边是m,那么只要使得其他两边的和大于m,这三边就一定能组成三角形,反之不能。那么求任意两边的和就用到了fft,把输入的数x看做是第x项系数加1.通过自己卷自己的方式得到任意两边的和再去掉重复的,包括一根木头同时用了两次的情况和顺序颠倒的情况要除以二。用ans[i]...
HDU 4609 3-idiots(FFT+容斥) 题意:给你n个边长,从中任意选择三个,问你能组成三角形的概率是多少?(同一个边长只能选择一次) 题解:会了FFT,这题就好做多了,首先我们开一个num数组,记录每种长度出现的次数。 然后对num数组进行DFT变换,再让其num[i]*num[i],此时数组的意义就是从若干边中选择两条边所能...
hdu4609(fft) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给出 n 根木棒求从中任取三根可以组成三角形的概率. 思路: fft 将a 数组转化为 num 数组, 其中 num[i] 为长度为 i 的木棒的数目, 再做 num 和 num 的卷积, 这步可以用 fft 模板完成. 将卷积结果存入 num 中, ...
所以用生成函数搭配FFT在O(NlogN)O(NlogN)的时间内计算两边之和对应的个数.设cnt[i]cnt[i]为值ii出现的次数.先不考虑元素的重复使用情况,则卷积的两个函数都是数组cnt[i]cnt[i]. 设ans[i]ans[i]为两边之和为i的个数,但需要减去重复计算的情况,每个ans[i]*2的项需要减1;重复枚举了ans[i]+ans[...