ZJOI2014 力

一道简单的\(FFT\)
题目链接

题意简述

给定一个公式\(E_i=\sum_{ji}\frac{q_j}{(i-j)^2}\)
\(E\).


解析

先把公式抄下来\(E_i=\sum_{ji}\frac{q_j}{(i-j)^2}\)
我们令
\(A_i=q_i\)
\(i<0,B_i=-\frac{1}{i^2}\)
\(i=0,B_i=0\)
\(i>0,B_i=\frac{1}{i^2}\)
于是发现\(E_i=\sum_{j=0}^{n-1}A_j{B_{i-j}}\)
然后就是\(FFT\)板子题了.
注意读入的时候要平移一下,把\(B_i\)\(i\)变成自然数.

代码如下

#include
#include
#include
#include
#include
#include
#define N (600010)
#define inf (0x7f7f7f7f)
#define rg register int
#define Label puts("NAIVE")
#define spa print(' ')
#define ent print('\n')
#define rand() (((rand())<<(15))^(rand()))
typedef long double ld;
typedef long long LL;
typedef unsigned long long ull;
using namespace std;
const ld PI=3.14159265359;
struct com{
    ld a,b;
    com(){a=b=0;}
    com operator +(com x){
        com res;
        res.a=a+x.a,res.b=b+x.b;
        return res;
    }
    com operator -(com x){
        com res;
        res.a=a-x.a,res.b=b-x.b;
        return res;
    }
    com operator *(com x){
        com res;
        res.a=a*x.a-b*x.b,res.b=a*x.b+b*x.a;
        return res;
    }
}a[N],b[N];
int n,rev[N],Lim,len;
void FFT(com *a,int tp){
    for(int i=0;i>1]>>1)|((i&1)<<(len-1));
    FFT(a,1),FFT(b,1);
    for(int i=0;i

转载于:https://www.cnblogs.com/Romeolong/p/10075103.html

你可能感兴趣的:(ZJOI2014 力)