LOJ#3045 "ZJOI2019" スイッチ

ポータル

不滅のタイトル

BIG#3045

ポータル

\(P = \和P_I \)

最初のために\(I \)の位置、それを考慮すると、\(N- \)指数関数を生成するように構成された時間の後、有効な確率、\(F_iと(X)\)

\ [\開始{整列} F_iと(X)&= \ sum_ {J \ BMOD 2 = S_I} \左(P_I \オーバーP \右)^ J {J上のx ^ J \!} \\&= {E ^ {P上p_ix \} +( - 1)^ {S_I} E ^ { - P上p_ix \} \ 2オーバー} \\ \端{整列} \]

総確率だから\(EGF \)があります

\ [\開始{整列} F P上(X)= \ prod_ {I = 1} ^ nは{E ^ {p_ix \} +( - 1)^ {S_I} E ^ { - P上p_ix \} \上2} \端{整列} \]

ここでは、しかし、それが終了することも可能です\(\ n)をステップは、最終的な状態に到達する前に、この状況が終了状態最初に到達した後に考えることができ、リングの数は、終了状態に戻ります

私たちは歩いて考える(\ n)は\確率の開始点までのステップバック

\ [{整列}始める\ G(X)= \ prod_ {I = 1} ^ nは{E ^ {p_ix \オーバーP} + E ^ { - p_ix \オーバーP} \ 2上} \端{整列} \ ]

オーダー\(H(X)\)を表し応答生成機能ので、これら三つの機能は、その\(\ OGFの)である\(F、G、H \) そこ

\ [\開始{整列} H(x)をG(x)= f(x)が\\ H(X)= {f(x)が\オーバーG(X)} \端{整列} \]

以降(H(x)は\)\確率発生関数であるので、答えは\(H「(1)\ )

なぜなら

\ [\開始{整列} H '(X)= {F'(x)をG(x)は-g '(x)は、F(X)\オーバーG ^ 2(X)} \端{整列} \]

私たちは、\(F(x)は\)の形で書かれました

\ [\開始{整列} F(X)= \ sum_ {I = -P} ^ Pのa_ie ^ {IX \オーバーP} \端{整列} \]

次いで、対応する\(F(X)\)であります

\ [\開始{整列} F(X)= \ sum_ {I = -P} ^ Pのa_iを{1 \上1- {IX \オーバーP}} \端{整列} \]

しかし、その場合に見出さ\(X = 1 \)の場合(\ F(X))\\(G(X)\)場合(収束していない(iはP \)= \場合フォームのスコアバック{1(\ \ 0}オーバー\))、我々は必要ように\(F(X)\)\((X)\)G同時に乗算(\ prod_が{iは1 = \ } ^ N \左(1- {IX \ P}オーバー\右)\) これは答えには影響を与えません。この時、\(f(x)が\)であります

\ [{{整列} F(X)= \ sum_ {I = -P} ^ P a_iを\ prod_ {J \ NEQ I} \左({1- {JX \オーバーP}} \右)\端を開始\整列} \]

場合\(X = 1 \) リア\(J = P \)は背面につながる可能性が\(0 \) それは

\ [\開始{整列} F(1)= A_P \ prod_ {J \ NEQ P} \左({1- {JX \オーバーP}} \右)\端{整列} \]

以下のための\(F「(X)\) なぜなら

\ [\ \ \ '= \ sum_i a_iを\ prod_ {J \ NEQ I}(1 + a_jx)(prod_i(1 + a_ix)\右\)\左{整列}端{整列を}開始]

我々\(F「(X)\ ) 二分割演算部\(I \ NEQ P \)は、あります

\ [{整列} A(X)= \ sum_ {I \ NEQ P} a_iを\ sum_ {K \ NEQ I} \左(-k \オーバーP \右)\ prod_ {J \ NEQ I、Jを開始\ \ NEQ K} \左(1- {JX \オーバーP} \右)\端{整列} \]

場合\(X = 1 \)\(K \ NEQ P \)続いたときに、\(0 \) そう

\ [\ {整列} A(1)=始まる - \ sum_ {I \ NEQ P} a_iを\ prod_ {J \ NEQ I、J \ NEQのP} \左(1- {P上J \} \右)を\端{整列} \]

しばらく(iはPを= \)\が、部分

\ [\左\ {整列} B(1)= A_P \ sum_ {I \ NEQ Pを}開始( - 右\ {iは\ P上})\ prod_左{J \ NEQ I、J \ NEQのP}(\ 1- {P上J \} \右)\端{整列} \]

そう

\ [\ {整列} F '(1)開始&= A(1)+ B(1)\\&= - \ {I \ NEQ P} prod_ \左(1- \ FRAC {I} {P} \右)\左(\ sum_ {J \ NEQ P} \ FRAC {a_j} {1- \ FRAC {J} {P}} + A_P \ sum_ {J \ NEQ P} \ FRAC {\ FRAC {J} {P }} {1- \ FRAC {J} {P}} \右)\端{整列} \]

\(G「(x)が\ ) 同様に直接代入することができ

あなたが簡単にするために続けることができると言われて、私は実際に背後を理解していません

//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=998244353,inv2=(P+1)>>1;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int inc(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
    R int res=1;
    for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
    return res;
}
const int N=5e4+5;
int f[N<<1],g[N<<1],tmp[N<<1],s[N],p[N],n,res,sum;
inline int calc(int *f){
    R int res=1,ism=ksm(sum,P-2);
    fp(i,-sum,sum-1){
        R int iv=mul(inc(i,P),ism);
        res=mul(res,P+1-iv);
    }
    return mul(res,f[sum+N]);
}
inline int dir(int *f){
    R int res=1,ret=0,ism=ksm(sum,P-2);
    fp(i,-sum,sum-1){
        R int iv=mul(inc(i,P),ism);
        res=mul(res,P+1-iv);
        upd(ret,mul(ksm(P+1-iv,P-2),inc(f[i+N],mul(f[sum+N],iv))));
    }
    return inc(0,P-mul(res,ret));
}
int main(){
//  freopen("testdata.in","r",stdin);
    scanf("%d",&n);
    fp(i,1,n)scanf("%d",&s[i]);
    fp(i,1,n)scanf("%d",&p[i]);
    f[N]=g[N]=1;
    fp(i,1,n){
        R int v=p[i];
        sum+=v;
        fp(j,-sum,sum)tmp[j+N]=0;
        R int c1=inv2,c2=s[i]?P-inv2:inv2;
        fp(j,-sum+v,sum)upd(tmp[j+N],mul(c1,f[j+N-v]));
        fd(j,sum-v,-sum)upd(tmp[j+N],mul(c2,f[j+N+v]));
        fp(j,-sum,sum)f[j+N]=tmp[j+N],tmp[j+N]=0;
        fp(j,-sum+v,sum)upd(tmp[j+N],mul(c1,g[j+N-v]));
        fd(j,sum-v,-sum)upd(tmp[j+N],mul(c1,g[j+N+v]));
        fp(j,-sum,sum)g[j+N]=tmp[j+N];
    }
    R int res=calc(g);
    res=ksm(res,P-2),res=mul(res,res);
    res=mul(res,inc(mul(dir(f),calc(g)),P-mul(dir(g),calc(f))));
    printf("%d\n",res);
    return 0;
}

おすすめ

転載: www.cnblogs.com/yuanquming/p/12056239.html