bzoj千题计划256:bzoj2194: 快速傅立叶之二

news/2024/7/17 4:32:18 标签: php

http://www.lydsy.com/JudgeOnline/problem.php?id=2194

 

相乘两项的下标 的 差相同

那么把某一个反过来就是卷积形式

fft优化

 

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int N=(1<<18)+2;

const double pi=acos(-1);

int r[N];

struct Complex
{
    double a,b;

    Complex(double x_=0,double y_=0):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=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}

void fft(E *a,int f)
{
    for(int i=0;i<n;++i)
        if(i<r[i]) swap(a[i],a[r[i]]);
    for(int i=1;i<n;i<<=1)
    {
        E wn(cos(pi/i),f*sin(pi/i));
        for(int p=i<<1,j=0;j<n;j+=p)
        {
            E w(1,0);
            for(int k=0;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=0;i<cnt;++i)
    {
        read(x); read(y);
        A[cnt-1-i].a=x;
        B[i].a=y;
    }
    int m=cnt+cnt-2,l=0;
    for(n=1;n<=m;n<<=1) l++;
    for(int i=0;i<n;++i) r[i]=(r[i>>1]>>1)|((i&1)<<l-1);
    fft(A,1);
    fft(B,1);
    for(int i=0;i<n;++i) C[i]=A[i]*B[i];
    fft(C,-1);
    for(int i=cnt-1;i>=0;--i) printf("%d\n",int(C[i].a/n+0.5));
}            

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8503181.html


http://www.niftyadmin.cn/n/1629412.html

相关文章

傅立叶变换常用库--fftw

FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散 傅里叶变换的标准C语言程序集&#xff0c;其由MIT的M.Frigo 和 S. Johnson 开发。可计算一维或多维实和复数据以及任意规模的 DFT。FFTW 还包含对共享和分布式存储系统的并行变换&#xff0c;它可自动适应…

函数指针—没你想的那么难

https://www.runoob.com/w3cnote/cpp-func-pointer.html

Linux部分命令解释

bin BINaries -----二进制 /dev DEVices -----设备 /etc ETCetera -----诸如此类 /lib LIBrary /proc PROCesses /sbin Superuser BINaries /tmp TeMPorary /usr Unix Shared Resources /var VARiable ? FIFO First In, First Out GRUB GRand Unified Boot…

hihocoder 1449 后缀自动机三·重复旋律6

描述 小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为一段数构成的数列。 现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数。但是K不是固定的&#xff0c;小Hi想知道对于所有的K的答案。 parants树上拓扑 合并endpos 1 #pragma G…

隔断推拉门滑动不畅常见的原因和解决方法

隔断推拉门滑动不畅常见的原因和解决方法如下&#xff1a; 1. 滑轨污秽&#xff1a;如果滑轨上有灰尘、油垢或杂物积聚&#xff0c;会影响推拉门的滑动效果。解决方法是定期清洁滑轨&#xff0c;使用吸尘器或刷子清除污垢&#xff0c;并用湿布擦拭干净。 2. 滑轨损坏&#xff1…

生成可执行程序的四个步骤——预处理,编译,汇编,链接

目录 导读 一.预编译 二.编译 三.汇编 四.链接 五.扩展 六.例子 生成.o目标文件&#xff08;编译间段&#xff09; 查看符号表信息&#xff08;编译间段&#xff09; .o目标文件的文件格式 查看.o文件的段头信息&#xff08;编译间段&#xff09; 查看汇编代码&…

设计模式---Adapter模式

首先对适配器模式做个简单的使用说明&#xff1a; 在以下各种情况下使用适配器模式&#xff1a; 1&#xff0e;系统需要使用现有的类&#xff0c;而此类的接口不符合系统的需要。 2&#xff0e;想要建立一个可以重复使用的类&#xff0c;用于与一些彼此之间没有太大关联的一些…

一、继承的基本概念、定义方法及访问限定

目录 一.继承的基本概念、定义派生类 二.继承和访问的区别 三.访问限定符 四.保护继承和私有继承的区别 一.继承的基本概念、定义派生类 面向对象的四个基本特征&#xff1a;抽象&#xff0c;封装&#xff0c;继承和多态&#xff0c;其中最主要的特征是继承和多态。 继承&a…