SPOJ FFT TSUM
第一道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 ;
}
代码君
SPOJ FFT TSUM的更多相关文章
- SPOJ TSUM Triple Sums(FFT + 容斥)
		
题目 Source http://www.spoj.com/problems/TSUM/ Description You're given a sequence s of N distinct int ...
 - spoj TSUM - Triple Sums   fft+容斥
		
题目链接 首先忽略 i < j < k这个条件.那么我们构造多项式$$A(x) = \sum_{1现在我们考虑容斥:1. $ (\sum_{}x)^3 = \sum_{}x^3 + 3\s ...
 - SPOJ - TSUM 母函数+FFT+容斥
		
题意:n个数,任取三个加起来,问每个可能的结果的方案数. 题解:构造母函数ABC,比如现在有 1 2 3 三个数.则 其中B表示同一个数加两次,C表示用三次.然后考虑去重. A^3表示可重复地拿三个. ...
 - SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法
		
SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...
 - spoj VFMUL FFT快速傅立叶变换模板题
		
题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...
 - 2018.11.18 spoj Triple Sums(容斥原理+fft)
		
传送门 这次fftfftfft乱搞居然没有被卡常? 题目简述:给你nnn个数,每三个数ai,aj,ak(i<j<k)a_i,a_j,a_k(i<j<k)ai,aj,ak( ...
 - SPOJ Triple Sums(FFT+容斥原理)
		
# include <cstdio> # include <cstring> # include <cstdlib> # include <iostream& ...
 - SPOJ:Triple Sums(母函数+FFT)
		
You're given a sequence s of N distinct integers.Consider all the possible sums of three integers fr ...
 - SPOJ MAXMATCH - Maximum Self-Matching (FFT)
		
题目链接:MAXMATCH - Maximum Self-Matching Description You're given a string s consisting of letters 'a', ...
 
随机推荐
- PHP正则表达式 - 附录(常用正则表达式)
			
常用正则表达式附录I 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1- ...
 - 洛谷P3928 SAC E#1 - 一道简单题 Sequence2
			
提交地址 题目背景 小强和阿米巴是好朋友. 题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强. ...
 - c# Redis操作类
			
需要添加StackExchange.Redis.dll引用 using System; using System.Collections.Generic; using System.IO; using ...
 - [20190618]日常学习记录(二)-flex属性及vue实战
			
早上在看flex属性,总结一下它的优缺点 为什么使用flex, 她和浮动相比,代码更少.浮动要考虑左浮动右浮动,有时还要去清除浮动.flex一行代码就搞定了. 她更灵活,实现平均分配,根据内容大小分配 ...
 - 微软Coco Blockchain Framework:一键解决企业级区块链三大难题
			
近年来,异军突起的“区块链”受到全行业的广泛关注,众多企业级用户在积极拥抱新技术的过程中却面临三大难题:性能.隐私和组织管理.如果不能很好地解决这些“顽固分子”,区块链技术就相对局限,很难发挥出应有的 ...
 - Python+selenium之窗口截图
			
自动化用例是由程序去执行,因此有时候打印的错误信息并不明确,如果在脚本执行错误的时候能对当前窗口截图保存,那么通过图片就可以非常直观的看出出错的原因.webdriver提供了截图函数get_scree ...
 - 一步一步教你玩转.NET Framework的配置文件app.config
			
转自https://www.cnblogs.com/tonnie/archive/2010/12/17/appconfig.html 在一般的项目中,为了使你的代码更加灵活,更方便调整,减少不必要的h ...
 - Wannafly Union Goodbye 2016-A//初识随机化~
			
想来想去还是把这个题写下来了.自己在补题遇到了许多问题. 给出n(n<=1e5)个点,求是否存在多于p(p>=20)×n/100的点在一条直线上... 时限20s,多组数据,暴力至少n^2 ...
 - windows自定义快速启动(运行)命令
			
自定义运行(windows键+R)里面命令,启动设置的程序,如图: 它的设置方法有两种: 第一种设置方法: 第1步:在任意地方创建一个文件夹(建议在D盘根目录创建),文件夹的名称可自定义没有特殊限制, ...
 - 在DataGridView控件中显示下拉列表
			
实现效果: 知识运用: DataGridViewComboBoxColumn类 //通过该类可以创建下拉列表样式的列 实现代码: private void Form1_Load(object send ...