HDU 4609 3-idiots(FFT)
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)相关推荐
- 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)
传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...
- 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)
整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...
- 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
参考北京师范大学的<计算物理基础> 第八章-快速傅里叶变换 计算物理基础_中国大学MOOC(慕课)www.icourse163.org 1.快速傅里叶变换 1.1 离散傅里叶变换及其变换 ...
- 快速傅里叶变换(FFT)详解
快速傅里叶变换(FFT)详解 (这是我第一次写博,不喜勿喷...) 关于FFT已经听闻已久了,这次终于有机会在Function2的介绍下来了解一下FFT了. 快速傅里叶变换(Fast Fourier ...
- P3803 【模板】多项式乘法(FFT)
P3803 [模板]多项式乘法(FFT) 题目描述 给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x). 请求出 F(x)和 G(x)的卷积. 从低到高输出F(x)*G(x)的系数 另一 ...
- 快速傅里叶变换(FFT)的C#实现及详细注释
快速傅里叶变换(FFT)的C#实现及详细注释 ----------------------------------------------------------------------------- ...
- 11.频域里的卷积——介绍,傅里叶变换和卷积,快速傅里叶变换(FFT)_1
目录 介绍 傅里叶变换和卷积 FFT 介绍 我们将继续讨论频率分析以及如何用频率分量的概念来研究图像.如果你还记得上次我们讲过的基于频率的图像分解的概念.我们通过给你们看这张照片来回忆它(如图).这是 ...
- 快速傅里叶变换 python_Python实现快速傅里叶变换的方法(FFT)
本文介绍了Python实现快速傅里叶变换的方法(FFT),分享给大家,具体如下: 这里做一下记录,关于FFT就不做介绍了,直接贴上代码,有详细注释的了: import numpy as np from ...
- 快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)
多项式表示法与卷积 多项式有两种表示方法 系数表示法 点值表示法 系数表示法 就是最普通的表示方法,如 f(x)=a0x0+a1x1+a2x2+......+an−1xn−1f(x) = a_0x^0 ...
- 【STM32F429的DSP教程】第25章 DSP变换运算-快速傅里叶变换原理(FFT)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第25章 DSP变换运算-快速傅里叶变换原理(F ...
最新文章
- Iptables 表和链之间的关系【未完成】
- 【跃迁之路】【545天】程序员高效学习方法论探索系列(实验阶段302-2018.08.04)...
- Android之Bitmap高效缓存以及android缓存策略
- jms spring_JMS和Spring:有时很重要的小事情
- Jmeter----5.1 设置中文
- 如何在 reducer 之间共享 state?
- 无穷级数判敛方法使用限制
- Centos7.x 装机优化
- java什么是工作空间_[Java教程]Java开发工具(Eclipse工作空间的基本配置)
- 使用kubeadm搭建的k8s集群修改node节点主机名
- 关于.Net WebProxy【转】
- ESET病毒库更新提示0x210a报错
- 共享没有计算机网络连接不上去,苹果usb共享给电脑连接不上怎么办
- 分享| 电脑设置双屏或多屏显示2种简单方法,你能学会几种?
- 25 - 线程池和指令系统
- 第三章 国外信托公司业务
- cocos2dx-9.键盘事件-实现精灵的连续移动
- SVG格式图片的放大
- 初学数据治理必读书单(2022年版本)
- html代码轮播图片错位,可拖动选项卡嵌套图片轮播时图片错位的问题
热门文章
- unable to launch什么意思_都表示太...以至于,so … that…?与too… to …有着明显区别...
- 有一个会泰勒级数的八岁表妹是怎样一种体验?
- 鉴别一个人是否 js 入门的标准竟然是?!
- php验证手机验证码过期,验证过期时间
- curd什么意思中文_每日一句英译英:She's a ten什么意思?
- 加个ing是什么意思_take的意思竟然是“要求”?奇奇怪怪的熟词僻义打卡终于来了!...
- linux端口 fcs校验,我如何接收错误的以太网帧并禁用CRC / FCS计算?
- 计算机bq,BQ24721部分翻译
- springboot2 多线程写入数据_解决SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean问题...
- leetcode337. 打家劫舍 III