タイトル
効果の対象に
もし非負整数列の数\(\) 、ゼロよりも大きい互いに選択する確率\(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;
}
概要
理想の直線は本当に素晴らしいああです......