第一道FFT的题目。

在网上找了很多FFT的资料,但一直都看不懂,最后是看算法导论学的FFT,算法导论上面写的很详细,每一步推导过程都有严格的证明。

下面说这道题

题意:

给一个序列s,有n个不互相同的整数。现在从这个序列中选出一个包含3个不同的整数的集合,对于他们的和为sum来说,求一共有多少种选法。(注意:3个数的先后顺序都看做一种选法)

分析:

构造一个多项式A(x),这n个数作为多项式的指数。

A3(x)中的每一项的指数对应三个数的和,前面的系数是取数的方案数。

然而这并不是题目所求,这样的选法是任意取三个数,可能相同可能不同。

其中多计算了不合法的方案:

任意取三个数的方案数 = 取三个相同的数 + 取两个相同的数和另一个不同的数 + 三个互不相同的数

用式子表达出来就是: (图片来自叉姐PPT)

整理一下,答案就是:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <complex>
#include <cmath>
using namespace std; typedef long long LL;
const double PI = acos(-1.0);
typedef complex<double> Complex; const int maxn = ( << ); void FFT(Complex P[], int n, int oper)
{
for(int i = , j = ; i < n - ; i++)
{
for(int s = n; j ^= s >>= , ~j & s; );
if(i < j) swap(P[i], P[j]);
} int log = ;
while((n & ( << log)) == ) log++;
for(int s = ; s < log; s++)
{
int m = ( << s);
int m2 = m * ;
Complex wm = Complex(cos(PI / m), sin(PI / m) * oper);
for(int k = ; k < n; k += m2)
{
Complex w(, );
for(int j = ; j < m; j++, w = w * wm)
{
Complex t = w * P[k + j + m];
Complex u = P[k + j];
P[k + j] = u + t;
P[k + j + m] = u - t;
}
}
} if(oper == -) for(int i = ; i < n; i++) P[i].real() /= n;
} int A[maxn], A2[maxn], A3[maxn];
Complex a[maxn], b[maxn]; int main()
{
int n; scanf("%d", &n);
while(n--)
{
int x; scanf("%d", &x);
x += ;
A[x]++;
A2[x*]++;
A3[x*]++;
}
for(int i = ; i < maxn; i++) a[i] = A[i], b[i] = A2[i]; FFT(a, maxn, );
FFT(b, maxn, );
for(int i = ; i < maxn; i++) a[i] = a[i] * (a[i] * a[i] - b[i] * 3.0);
FFT(a, maxn, -); for(int i = ; i < maxn; i++)
{
LL ans = (LL)((a[i].real() + 0.5) + A3[i] * ) / ;
if(ans > ) printf("%d : %lld\n", i - , ans);
} return ;
}

代码君

最新文章

  1. 【完全开源】Django多人博客系统——支持MarkDown和tinyMce
  2. C语言输出字符串
  3. JQuery asp.net 简单入门
  4. Android -- 自定义View小Demo,绘制钟表时间(一)
  5. sychronized面试问题浅析
  6. MYSQL基础01(新增,修改,删除)
  7. E - Find The Multiple
  8. 优化HTTP前端请求构建高性能ASP.NET站点
  9. Ubuntu 14.04 下手动安装Firefox的Flash插件
  10. 50 tips of JavaScript
  11. 核心C#
  12. 电梯系列——OO Unit2分析和总结
  13. Object Detection / Human Action Recognition 项目
  14. linux网络设备驱动
  15. 【代码笔记】iOS-UIAlertView3秒后消失
  16. RESTful API 学习
  17. 堆排序(php实现)
  18. 飞舞的蝴蝶(GraphicsView框架)
  19. js高级程序设计 笔记 --- 错误处理、json和ajax
  20. 20145209刘一阳 《网络对抗》逆向及BOF基础实践

热门文章

  1. nodejs 中的异步之殇
  2. Webpack 入门学习
  3. android 跨进程通讯 AIDL
  4. object flash
  5. 判断JS数据类型的几种方法
  6. 微软大礼包 | 集合在线学习资源,助你秒变AI达人
  7. [论文理解]Deep Residual Learning for Image Recognition
  8. ansible 通过堡垒机/跳板机 访问目标机器需求实战(ssh agent forward)
  9. opencv中mat的type
  10. python_83_random_应用验证码