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', ...
随机推荐
- Ionic开发-搭建开发环境
1安装node.js 2安装ionic & cordova: 命令行输入:npm install –g cordova ionic 注:-g表示全局安装,也可以进入指定的目录安装,但这里推荐全 ...
- Spring 顾问
1.名称匹配方法切入点顾问 接口:ISomeService public interface ISomeService { public void doSome(); public void doSe ...
- 开机报错 the connected AC adapter has a lower wattage than the recommended model which was shipped with the system。
机型:联想Thinkpad T410 报错场景:在电脑插上电源充电情况下开机,会自动进入bios setup utility提示你需要重新设置日期时间.date/time 报错提示:The conne ...
- vue2.0:(七)、vue-resource
本篇文章开始前,先介绍下什么是vue-resource,并且现在还有一个axios. Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必 ...
- Selenium3+webdriver学习笔记3(xpath方式元素定位)
#!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriver import time,os # about:ad ...
- AHK进阶之路
本文摘自 http://www.cnblogs.com/echorep/p/4911117.html 小鸟学AHK(1)之运行程序或打开文档 AHK就是AutoHotKey,是一款免费的.Wind ...
- Ubuntu下安装XAMPP
来源:http://www.ido321.com/1265.html 最近,我也玩起了Linux了,瞬间觉得自己逼格又上去了,所以,就给笔记本安装了Ubuntu+Win7双系统.当然在Ubuntu下必 ...
- [VC]在VC++中实现让程序只运行一个实例的方法且实现该实例
方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C+ ...
- Talent Show
6349: Talent Show 时间限制: 1 Sec 内存限制: 128 MB提交: 106 解决: 40[提交] [状态] [讨论版] [命题人:admin] 题目描述 Farmer Jo ...
- 字符编码:WideCharToMultiByte
WideCharToMultiByte 编辑 目录 1基本介绍及功能 2相关变量 1基本介绍及功能编辑 WideCharToMultiByte 函数功能:该函数映射一个unicode字符串 ...