FFT(快速傅立叶变换)求数组中两两之和小于某个数的有多少个
来源:互联网 发布:神机配模软件 编辑:程序博客网 时间:2024/06/05 10:08
#include <cmath>//fft求在a数组里任意选取2个数的和有多少种情况#include <cstdio>//num[i]存的是和为i的有多少个#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL long longconst double pi=acos(-1.0);struct Complex{ double x,y;//实部,虚部 Complex(double _x=0.0,double _y=0.0) { x=_x; y=_y; } Complex operator -(const Complex &b)const { return Complex(x-b.x,y-b.y); } Complex operator +(const Complex &b)const { return Complex(x+b.x,y+b.y); } Complex operator *(const Complex &b)const { return Complex(x*b.x-y*b.y,x*b.y+y*b.x); }};void change(Complex y[],int len){ int i,j,k; for(i=1,j=len/2;i<len-1;i++) { if(i<j) swap(y[i],y[j]); k=len/2; while(j>=k) { j-=k; k/=2; } if(j<k) j+=k; }}void fft(Complex y[],int len,int on){ change(y,len); for(int h=2;h<=len;h<<=1) { Complex wn(cos(-on*2*pi/h),sin(-on*2*pi/h)); for(int j=0;j<len;j+=h) { Complex w(1,0); for(int k=j;k<j+h/2;k++) { Complex u=y[k]; Complex t=w*y[k+h/2]; y[k]=u+t; y[k+h/2]=u-t; w=w*wn; } } } if(on==-1) { for(int i=0;i<len;i++) y[i].x/=len; }}const int maxn=400040;Complex x1[maxn];int a[maxn];LL num[maxn];LL sum[maxn];int main(){ int ncase; scanf("%d",&ncase); while(ncase--) { memset(num,0,sizeof(num)); int n,k; scanf("%d%d",&n,&k); for(int i=0;i<n;i++) { scanf("%d",&a[i]); num[a[i]]++; } sort(a,a+n); int len1=a[n-1]+1; int len=1; while(len<2*len1) len<<=1; for(int i=0;i<len1;i++) x1[i]=Complex(num[i],0); for(int i=len1;i<len;i++) x1[i]=Complex(0,0); fft(x1,len,1); for(int i=0;i<len;i++) x1[i]=x1[i]*x1[i]; fft(x1,len,-1); for(int i=0;i<len;i++) num[i]=(long long)(x1[i].x+0.5); len=2*a[n-1]; for(int i=0;i<n;i++)//减去2次选的同一个数 num[a[i]+a[i]]--; for(int i=1;i<=len;i++) num[i]/=2;//选1 2和选2 1是一样的所以除2 sum[0]=0; for(int i=1;i<=len;i++)//num的前缀和 sum[i]=sum[i-1]+num[i]; while(k--) { int s; scanf("%d",&s); printf("%lld\n",sum[s-1]); } }}
kuangbin FFT讲解
0 0
- FFT(快速傅立叶变换)求数组中两两之和小于某个数的有多少个
- 快速傅立叶变换(FFT)
- 快速傅立叶变换(FFT)
- 【FFT-快速傅立叶变换】
- 快速傅立叶变换FFT
- 快速傅立叶变换(FFT)的C++实现
- 快速傅立叶变换(FFT)的C#代码
- FFT快速傅立叶变换的工作原理
- FFT快速傅立叶变换的工作原理
- 快速傅立叶变换FFT的实现
- 快速傅立叶变换(FFT)的一种推导
- 快速傅立叶变换算法 FFT
- FFT快速傅立叶变换的工作原理与流程
- 神经网络中快速傅立叶变换(FFT)的梯度传递
- 快速傅立叶变换(FFT)C语言函数
- [UOJ34]多项式乘法(快速傅立叶变换FFT)
- [codevs3123]大整数乘法(快速傅立叶变换FFT)
- [BZOJ4503]两个串(快速傅立叶变换FFT)
- Android shape drawable 讲解
- jsp电子商务 购物车实现之一 设计篇
- Android学习路线图
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Android知识点总结
- FFT(快速傅立叶变换)求数组中两两之和小于某个数的有多少个
- SpringMVC如何引入css文件
- PHP自学经典----CH10.正则表达式
- 仿百度搜索的加载动画
- 理解整数运算的属性以及溢出的检查
- 树状数组
- FileReader与InputStreamReader关系
- 支持向量机通俗导论(理解SVM的三层境界)
- 图形中添加纯文本注释(text)