bzoj千题计划256:bzoj2194: 快速傅立叶之二
2024-08-29 10:24:03
http://www.lydsy.com/JudgeOnline/problem.php?id=2194
相乘两项的下标 的 差相同
那么把某一个反过来就是卷积形式
fft优化
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; const int N=(<<)+; const double pi=acos(-); int r[N]; struct Complex
{
double a,b; Complex(double x_=,double y_=):a(x_),b(y_) {} Complex operator + (Complex p)
{
Complex c;
c.a=a+p.a;
c.b=b+p.b;
return c;
} Complex operator - (Complex p)
{
Complex c;
c.a=a-p.a;
c.b=b-p.b;
return c;
} Complex operator * (Complex p)
{
Complex c;
c.a=a*p.a-b*p.b;
c.b=a*p.b+b*p.a;
return c;
}
}; typedef Complex E;
E A[N],B[N],C[N]; int n; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void fft(E *a,int f)
{
for(int i=;i<n;++i)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int i=;i<n;i<<=)
{
E wn(cos(pi/i),f*sin(pi/i));
for(int p=i<<,j=;j<n;j+=p)
{
E w(,);
for(int k=;k<i;++k,w=w*wn)
{
E x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y; a[j+k+i]=x-y;
}
}
}
} int main()
{
int cnt;
read(cnt);
int x,y;
for(int i=;i<cnt;++i)
{
read(x); read(y);
A[cnt--i].a=x;
B[i].a=y;
}
int m=cnt+cnt-,l=;
for(n=;n<=m;n<<=) l++;
for(int i=;i<n;++i) r[i]=(r[i>>]>>)|((i&)<<l-);
fft(A,);
fft(B,);
for(int i=;i<n;++i) C[i]=A[i]*B[i];
fft(C,-);
for(int i=cnt-;i>=;--i) printf("%d\n",int(C[i].a/n+0.5));
}
最新文章
- oracle xmltype导入并解析Excel数据 (二)规则说明
- SQLSERVER如何查看索引缺失
- wpf 属性变更通知接口 INotifyPropertyChanged
- 如何使Android应用开机时自动启动
- 设置oracle_home
- PHP 统计中文字符串的长度
- TDBXCommand TDBXReader
- jsViews validates(验证)
- [转] 博闻强识:了解CSS中的@ AT规则 ---张鑫旭
- Binary Tree Inorder Traversa
- Axis2 转让Webservice 介面
- SSM框架的搭建
- ppt的那些小事(一)
- 【欧拉函数】BZOJ2705: [SDOI2012]Longge的问题
- [Linux] - 利用ping给端口加密,限制访问
- js中时间戳转换成时间格式
- Git高级操作
- js 的正则表达式 部分展示test()方法的验证功能
- vim自定义配置之常规设置
- 史上最严管控,Android P非SDK接口管控特性解读及适配