3-idiots

思路

多项式卷积的经典应用了:

看样例一:

4
1 3 3 4

我们用多项式系数表示得到一个与aia_iai​有关的多项式:010210\ 1\ 0\ 2\ 10 1 0 2 1,

也就说明原序列有0个1,1个1,0个2,2个3,1个4,

这个多项式卷积之后得到:0 0 1 0 4 2 4 4 1

也就是可重复使用上面的两个数可以得到1个2…\dots…

由此我们就确定了三角形的两条边了,但是因为可重复使用+有序,所以我们要对上面的数值做一点点改变。

for(int i = 1; i <= n; i++) {num[x[i] + x[i]]--;
}//去除重复使用
for(int i= 0; i < lim; i++) {num[i] >>= 1;
}//把序列变成有序状态

接下来就是找出合法的组合方案了。

我们枚举最大的边,把不合法的方案都给减去即可。

代码

/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;typedef long long ll;const double pi = acos(-1.0);const int N = 1e6 + 10;struct Complex {double r, i;Complex(double _r = 0, double _i = 0) : r(_r), i(_i) {}}a[N];Complex operator + (const Complex & a, const Complex & b) {return Complex(a.r + b.r, a.i + b.i);
}Complex operator - (const Complex & a, const Complex & b) {return Complex(a.r - b.r, a.i - b.i);
}Complex operator * (const Complex & a, const Complex & b) {return Complex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}int r[N], x[N], n, m;ll num[N];void fft(Complex * f, int lim, int rev) {for(int i = 0; i < lim; i++) {if(r[i] < i) {swap(f[i], f[r[i]]);}}for(int i = 1; i < lim; i <<= 1) {Complex wn = Complex(cos(pi / i), rev * sin(pi / i));for(int p = i << 1, j = 0; j < lim; j += p) {Complex w = Complex(1, 0);for(int k = 0; k < i; k++, w = w * wn) {Complex x = f[j + k], y = w * f[i + j + k];f[j + k] = x + y, f[i + j + k] = x - y;}}}if(rev == -1) {for(int i = 0; i < lim; i++) {f[i].r /= lim;}}
}void get_r(int lim) {for(int i = 0; i < lim; ++i) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T, lim;scanf("%d", &T);while(T--) {scanf("%d", &n);memset(num, 0, sizeof num);for(int i = 1; i <= n; i++) {scanf("%d", &x[i]);num[x[i]]++;}sort(x + 1, x + 1 + n);lim = 1;while(lim <= (2 * x[n])) {lim <<= 1;}for(int i = 0; i <= x[n]; i++) {a[i] = Complex(num[i], 0);}for(int i = x[n] + 1; i < lim; i++) {a[i] = Complex(0, 0);}get_r(lim);fft(a, lim, 1);for(int i = 0; i < lim; i++) {a[i] = a[i] * a[i];}fft(a, lim, -1);for(int i = 0; i < lim; i++) {num[i] = int(a[i].r + 0.5);}for(int i = 1; i <= n; i++) {num[x[i] + x[i]]--;}for(int i= 0; i < lim; i++) {num[i] >>= 1;}ll tot = 1ll * n * (n - 1) * (n - 2) / 6, ans = tot;for(int i = 1, k = 1; i < lim; i++) {if(num[i]) {while(k <= n && i > x[k]) k++;if(k == n + 1) break;ans -= num[i] * (n - k + 1);}}printf("%.7f\n", 1.0 * ans / tot);}return 0;
}

C - Golf Bot(附赠裸题)

思路

多项式相乘一下,然后判断哪些值出现了,再记个数就行,FFT裸题。

代码

/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;typedef long long ll;const double pi = acos(-1.0);const int N = 1e6 + 10;struct Complex {double r, i;Complex(double _r = 0, double _i = 0) : r(_r), i(_i) {}}a[N];Complex operator + (const Complex & a, const Complex & b) {return Complex(a.r + b.r, a.i + b.i);
}Complex operator - (const Complex & a, const Complex & b) {return Complex(a.r - b.r, a.i - b.i);
}Complex operator * (const Complex & a, const Complex & b) {return Complex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r);
}int r[N], k[N], num[N], d[N], n, m, ans, lim;void fft(Complex * f, int lim, int rev) {for(int i = 0; i < lim; i++) {if(r[i] < i) {swap(f[i], f[r[i]]);}}for(int i = 1; i < lim; i <<= 1) {Complex wn = Complex(cos(pi / i), rev * sin(pi / i));for(int p = i << 1, j = 0; j < lim; j += p) {Complex w = Complex(1, 0);for(int k = 0; k < i; k++, w = w * wn) {Complex x = f[j + k], y = w * f[i + j + k];f[j + k] = x + y, f[i + j + k] = x - y;}}}if(rev == -1) {for(int i = 0; i < lim; i++) {a[i].r /= lim;}}
}void get_r(int lim) {for(int i = 0; i < lim; ++i) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d", &k[i]);num[k[i]]++;}sort(k + 1, k + 1 + n);lim = 1;while(lim < k[n] * 2) lim <<= 1;for(int i = 0; i < lim; i++) {a[i] = Complex(num[i], 0);}get_r(lim);fft(a, lim, 1);for(int i = 0; i < lim; i++) {a[i] = a[i] * a[i];}fft(a, lim, -1);for(int i = 0; i < lim; i++) {num[i] += int(a[i].r + 0.5);}scanf("%d", &m);for(int i = 1; i <= m; i++) {int x;scanf("%d", &x);if(num[x]) {num[x] = 0;ans++;}}printf("%d\n", ans);return 0;
}

HDU 4609 3-idiots(FFT)相关推荐

  1. 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)

    传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai​的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...

  2. 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...

  3. 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)

    参考北京师范大学的<计算物理基础> 第八章-快速傅里叶变换 计算物理基础_中国大学MOOC(慕课)​www.icourse163.org 1.快速傅里叶变换 1.1 离散傅里叶变换及其变换 ...

  4. 快速傅里叶变换(FFT)详解

    快速傅里叶变换(FFT)详解 (这是我第一次写博,不喜勿喷...) 关于FFT已经听闻已久了,这次终于有机会在Function2的介绍下来了解一下FFT了. 快速傅里叶变换(Fast Fourier ...

  5. P3803 【模板】多项式乘法(FFT)

    P3803 [模板]多项式乘法(FFT) 题目描述 给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x). 请求出 F(x)和 G(x)的卷积. 从低到高输出F(x)*G(x)的系数 另一 ...

  6. 快速傅里叶变换(FFT)的C#实现及详细注释

    快速傅里叶变换(FFT)的C#实现及详细注释 ----------------------------------------------------------------------------- ...

  7. 11.频域里的卷积——介绍,傅里叶变换和卷积,快速傅里叶变换(FFT)_1

    目录 介绍 傅里叶变换和卷积 FFT 介绍 我们将继续讨论频率分析以及如何用频率分量的概念来研究图像.如果你还记得上次我们讲过的基于频率的图像分解的概念.我们通过给你们看这张照片来回忆它(如图).这是 ...

  8. 快速傅里叶变换 python_Python实现快速傅里叶变换的方法(FFT)

    本文介绍了Python实现快速傅里叶变换的方法(FFT),分享给大家,具体如下: 这里做一下记录,关于FFT就不做介绍了,直接贴上代码,有详细注释的了: import numpy as np from ...

  9. 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)

    多项式表示法与卷积 多项式有两种表示方法 系数表示法 点值表示法 系数表示法 就是最普通的表示方法,如 f(x)=a0x0+a1x1+a2x2+......+an−1xn−1f(x) = a_0x^0 ...

  10. 【STM32F429的DSP教程】第25章 DSP变换运算-快速傅里叶变换原理(FFT)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第25章       DSP变换运算-快速傅里叶变换原理(F ...

最新文章

  1. Iptables 表和链之间的关系【未完成】
  2. 【跃迁之路】【545天】程序员高效学习方法论探索系列(实验阶段302-2018.08.04)...
  3. Android之Bitmap高效缓存以及android缓存策略
  4. jms spring_JMS和Spring:有时很重要的小事情
  5. Jmeter----5.1 设置中文
  6. 如何在 reducer 之间共享 state?
  7. 无穷级数判敛方法使用限制
  8. Centos7.x 装机优化
  9. java什么是工作空间_[Java教程]Java开发工具(Eclipse工作空间的基本配置)
  10. 使用kubeadm搭建的k8s集群修改node节点主机名
  11. 关于.Net WebProxy【转】
  12. ESET病毒库更新提示0x210a报错
  13. 共享没有计算机网络连接不上去,苹果usb共享给电脑连接不上怎么办
  14. 分享| 电脑设置双屏或多屏显示2种简单方法,你能学会几种?
  15. 25 - 线程池和指令系统
  16. 第三章 国外信托公司业务
  17. cocos2dx-9.键盘事件-实现精灵的连续移动
  18. SVG格式图片的放大
  19. 初学数据治理必读书单(2022年版本)
  20. html代码轮播图片错位,可拖动选项卡嵌套图片轮播时图片错位的问题

热门文章

  1. unable to launch什么意思_都表示太...以至于,so … that…?与too… to …有着明显区别...
  2. 有一个会泰勒级数的八岁表妹是怎样一种体验?
  3. 鉴别一个人是否 js 入门的标准竟然是?!
  4. php验证手机验证码过期,验证过期时间
  5. curd什么意思中文_每日一句英译英:She's a ten什么意思?
  6. 加个ing是什么意思_take的意思竟然是“要求”?奇奇怪怪的熟词僻义打卡终于来了!...
  7. linux端口 fcs校验,我如何接收错误的以太网帧并禁用CRC / FCS计算?
  8. 计算机bq,BQ24721部分翻译
  9. springboot2 多线程写入数据_解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题...
  10. leetcode337. 打家劫舍 III