羅区P3338 [ZJOI2014]力

水問題は、畳み込みフォームに鈍感ではありません\(QwQ \)

効果の件名:

所与\(N- \)\(Q_I \)の定義\(F_J \)次のように
\ [F_J = \ SUM \ limits_ {I <J} \ {q_iq_jのFRAC} {(のIJ)^ 2} - \和\ limits_ {I> J} \ FRAC {q_iq_j} {(IJ)^ 2} \]

\(E_i = \ FRAC {たf_i} {Q_I} \)

本当に少し表情を知ることができます

\(E_i = \ FRAC {たf_i} {Q_I} = \和\ limits_ {I <J} \ FRAC {Q_I} {(IJ)^ 2} - \和\ limits_ {I> J} \ FRAC {Q_I} { (IJ)^ 2} \)

我々は、セット(F [I] = Q_I \ \、G [I] = \ FRAC {1} {I ^ 2})

元の式をに変更し
、[\和\ limits_ {I \
<J} F [i]とG [IJ] - \和\ limits_ {I> J} F [i]とG [IJ] \]は、 と等価である
SUM \ [\ \ limits_ ^ {iが0 =}
{J-1} F [i]がG [IJ] - \和\ limits_ ^ {n}はF [i]は、G {iがJ + 1 =} [IJ] \] 我々セット\ (F ^ {「} \)\(F \)反転後の配列は、元の式に等しい
\ [\和\ limits_ {iが \和- = 0} ^ {J-1} F [i]がG [IJ] \ limits_は{I = 0} ^ {J-1} ^ {F「} [I] G [IJ] \]

これらの2つの式は、私はそれは適切ではないと思うの畳み込み必要があります\(qwq \)

#include<bits/stdc++.h>
using namespace std;
namespace red{
#define eps (1e-8)
    inline int read()
    {
        int x=0;char ch,f=1;
        for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
        if(ch=='-') f=0,ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=5e5+10;
    const double pi=acos(-1.0);
    int n;
    double f[N],rf[N],g[N],ans1[N],ans2[N];
    int limit,len;
    int pos[N];
    struct complex
    {
        double x,y;
        complex(double tx=0,double ty=0){x=tx,y=ty;}
        inline complex operator + (const complex t) const
        {
            return complex(x+t.x,y+t.y);
        }
        inline complex operator - (const complex t) const
        {
            return complex(x-t.x,y-t.y);
        }
        inline complex operator * (const complex t) const
        {
            return complex(x*t.x-y*t.y,x*t.y+y*t.x);
        }
    }a[N],b[N];
    inline void fft(complex *a,int inv)
    {
        for(int i=0;i<limit;++i)
            if(i<pos[i]) swap(a[i],a[pos[i]]);
        for(int mid=1;mid<limit;mid<<=1)
        {
            complex Wn(cos(pi/mid),inv*sin(pi/mid));
            for(int r=mid<<1,j=0;j<limit;j+=r)
            {
                complex w(1,0);
                for(int k=0;k<mid;++k,w=w*Wn)
                {
                    complex x=a[j+k],y=w*a[j+k+mid];
                    a[j+k]=x+y;
                    a[j+k+mid]=x-y;
                }
            }
        }
    }
    inline void work(double *f,double *g,double *ret)
    {
        for(int i=0;i<limit;++i)
        {
            a[i].x=f[i],b[i].x=g[i];
            a[i].y=b[i].y=0;
        }
        fft(a,1);
        fft(b,1);
        for(int i=0;i<limit;++i)a[i]=a[i]*b[i];
        fft(a,-1);
        for(int i=0;i<=n;++i) ret[i]=a[i].x/limit;
    }
    inline void main()
    {
        n=read();
        for(limit=1;limit<=(n<<1);limit<<=1) ++len;
        for(int i=0;i<limit;++i) pos[i]=(pos[i>>1]>>1)|((i&1)<<(len-1));
        for(int i=1;i<=n;++i)
        {
            scanf("%lf",&f[i]);
            g[i]=1.0/i/i;
            rf[i]=f[i];
        }
        reverse(rf+1,rf+n+1);
        work(f,g,ans1);
        work(rf,g,ans2);
        for(int i=1;i<=n;++i) printf("%.3f\n",ans1[i]-ans2[n-i+1]);
    }
}
signed main()
{
    red::main();
    return 0;
}

おすすめ

転載: www.cnblogs.com/knife-rose/p/12037453.html