zoukankan      html  css  js  c++  java
  • 【洛谷P3338】力

    题目大意:求

    [E_{j}=sum_{i<j} frac{q_{i}}{(i-j)^{2}}-sum_{i>j} frac{q_{i}}{(i-j)^{2}} ]

    题解:可以发现,这个和式隐藏着卷积的形式,即:设 (f(i)={1over i^2})(g(i)=q_i),则以上和式可以表示成 $$sumlimits_{i=0}^j g(i)f(j-i)$$,$$sumlimits_{i=j}^{n-1}g(i)f(i-j)$$,令 (f(0)=0) 即可让 j 这一项也参与运算。发现上面的和式直接就是一个卷积的计算,对于下面的和式来说,发现 f 和 g 的差是定值,这里采用将 g 翻转成 g‘,则原式变成$$sumlimits_{i=j}^{n-1}g'(n-i-1)f(i-j)$$可以发现,下标的和成为了定值,在对求和指标进行换元之后,也成为了一个卷积。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=4e5+10;
    const double pi=acos(-1);
    
    int n,m;
    struct cp{
        double x,y;
        cp(double xx=0,double yy=0):x(xx),y(yy){}
        friend cp operator+(const cp &a,const cp &b){return cp(a.x+b.x,a.y+b.y);}
        friend cp operator-(const cp &a,const cp &b){return cp(a.x-b.x,a.y-b.y);}
        friend cp operator*(const cp &a,const cp &b){return cp(a.x*b.x-a.y*b.y,a.y*b.x+b.y*a.x);}
    }a[maxn],b[maxn],c[maxn];
    int tot=1,bit,rev[maxn];
    
    void read_and_parse(){
        scanf("%d",&n),m=2*n-2;
        for(int i=0;i<n;i++)scanf("%lf",&a[i].x),b[n-1-i].x=a[i].x;
        for(int i=1;i<n;i++)c[i].x=1.0/i/i;
        while(tot<=m)tot<<=1,++bit;
        for(int i=0;i<tot;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
    }
    
    void fft(cp *t,int type){
        for(int i=0;i<tot;i++)if(i<rev[i])swap(t[i],t[rev[i]]);
        for(int mid=1;mid<tot;mid<<=1){
            cp wn(cos(pi/mid),type*sin(pi/mid));
            for(int j=0;j<tot;j+=(mid<<1)){
                cp w(1,0);
                for(int k=0;k<mid;k++,w=w*wn){
                    cp x=t[j+k],y=w*t[j+mid+k];
                    t[j+k]=x+y,t[j+mid+k]=x-y;
                }
            }
        }
        if(type==-1)for(int i=0;i<tot;i++)t[i].x/=tot;
    }
    
    void solve(){
        fft(a,1),fft(b,1),fft(c,1);
        for(int i=0;i<tot;i++)a[i]=a[i]*c[i],b[i]=b[i]*c[i];
        fft(a,-1),fft(b,-1);
        for(int i=0;i<n;i++)printf("%.3lf
    ",a[i].x-b[n-1-i].x);
    }
    
    int main(){
        read_and_parse();
        solve();
        return 0;
    } 
    
  • 相关阅读:
    IO流
    泛型类
    自动打包&解包:auto-boxing&unboxing
    Map接口
    如何选择数据结构
    Compareable接口
    List常用算法
    equals和==
    List接口
    set接口
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10817702.html
Copyright © 2011-2022 走看看