[JZOJ6340] [B] NOIP2019アナログ2019年9月4日

タイトル

効果の対象に

もし非負整数列の数\(\) ゼロよりも大きい互いに選択する確率\(a_iを\)を、それほどマイナス\(1 \)
Q \は(\ A_1)に還元される(0 \)\何回動作時間の予想通過。


歴史を考えます

この暴力の問題の練習のために、国家がそれを圧縮することができます明らかである......
そして、私は突然、実際に、私達は次のモデルに翻訳対象となる、ことを実現:
そこ\(N \)色、\(私は\)色のボールそこ(a_iを\)\ヶ月。だから、被験者は、要素の繰り返しの質問が配置されているになります。
まず\(2 \)\(n-は\)探し出し、その後、検討して配置\(1 \)ランダム挿入を。
最後に列挙\(1 \) プログラム番号は組み合わせの数の前に挿入され、それらが現れる、計算されます。
搬出されていないこの練習を演奏した後、私は数学の能力を知っていないかどうか、このアプローチは常に間違っている......となって
も、権利である、もちろん、それは練習の外ではありません。


正解

所望の線形抵抗は、タイトルに変換することができる:それぞれについて(I> 1 \)\ \ (A_1 \)は減少(0 \)\の場合(a_iを\)\数を取ることが望ましいです。次に、各\(私は\)これらの事のアップ追加、プラス\(A_1 \) 答えがあります。
だから我々はこの問題を検討する必要があります。
次のショーは、ほとんどのアクションです:私たちは考える(A_1 \)\\(a_iを\) 他は彼らには何の影響も失われることはありません。それらがマイナスであることの等しい確率を有している\(1 \)を、この確率は以下のように考えることができる\(\ FRAC 1} {2} {\) このようにして、表題対応\(N = 2 \)条件。
さて、の初めの座標平面を考える\((A_1、a_iを)\) 毎回ランダムウォークまたは左にグリッドの下に。
あなたが境界に達した場合は、\を((0、Y)\) そこされます(a_iを-Y \)\貢献をし、境界に達した場合には\((X、0)\)を、そこになります\(a_iを\)貢献。
境界のための\((0、Y)\ )、セットダウン行く\(J \)ステップ、確率\(\ {C_ {A_1 FRAC + J-J。1} ^ {}} + {2 ^ {A_1} Jを} \)
境界のために\((X、0)\)彼らの貢献が同じであるため、それは上記とであるかもしれない\(1 \)失う、それは確率です。
そして、式......一覧表示することができ
た後に見つけることは容易で記載されている、\((A_1、a_iを+を。1)\)の回答があり(O(1)\)\から\((a_iを、a_iを)\ ) の転送をオーバー。


コード

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cassert>
#define N 500010
#define A 500010
#define mo 323232323
inline int input(){
    char ch=getchar();
    while (ch<'0' || '9'<ch)
        ch=getchar();
    int x=0;
    do{
        x=x*10+ch-'0';
        ch=getchar();
    }
    while ('0'<=ch && ch<='9');
    return x;
}
int n,a[N];
int fac[N+A],invf[N+A],inv2[N+A];
int ans1[A*3],ans2[A*3],ans[A*3];
inline int inv(int x){
    int res=1;
    for (int y=mo-2;y;y>>=1,x=(long long)x*x%mo)
        if (y&1)
            res=(long long)res*x%mo;
    return res;
}
inline int C(int m,int n){return (long long)fac[m]*invf[n]%mo*invf[m-n]%mo;}
int main(){
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    n=input();
    for (int i=1;i<=n;++i)
        a[i]=input();
    fac[0]=1,inv2[0]=1;
    for (int i=1;i<=A*2;++i){
        fac[i]=(long long)fac[i-1]*i%mo;
        inv2[i]=(long long)inv2[i-1]*2%mo;
    }
    for (int i=0;i<=A*2;++i){
        invf[i]=inv(fac[i]);
        inv2[i]=inv(inv2[i]);
    }
    ans1[0]=ans2[0]=0;
    for (int i=1;i<=A;++i){
        ans1[i]=(ans1[i-1]+(long long)C(a[1]+i-2,i-1)*(i-1)%mo*inv2[a[1]+i-1]%mo)%mo;
        ans2[i]=(ans2[i-1]+(long long)C(a[1]+i-2,i-1)*inv2[a[1]+i-1]%mo)%mo;
        ans[i]=(ans1[i]+(long long)i*(1-ans2[i]+mo)%mo)%mo;
    }
    long long sum=a[1];
    for (int i=2;i<=n;++i)
        sum+=ans[a[i]];
    printf("%lld\n",sum%mo);
    return 0;
}

概要

理想の直線は本当に素晴らしいああです......

おすすめ

転載: www.cnblogs.com/jz-597/p/11483219.html