説明
入力
出力
サンプル入力
3
2 3 3
サンプル出力
202020207
データ制約
思考
存在していない要素があると仮定すると、特定の位置を考慮して、各要素の確率が操作されます。たった2つの要素に関係して見つけることができる場合は、それらには影響がない場合、他の要素が動作し、彼らは2つの確率が等しい動作しています。だから、問題は、元の問題の2つだけの要素の1に相当します。
だから、要素の間に独立しています!Dpが答え、合計の各要素の寄与を使用して計算します。
時間の複雑さ:O(A 2 + N-)
最適化:
ちょうど(A1、AI)(0,0)に歩き始めたから抽象化タスクは、それはO(1)統計解答することができ
コード
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=(5e5+77)*3,mod=323232323;
int f[N],g[N],fac[N],unfac[N],a[N],ans,mx,n;
ll power(ll x,ll t)
{
ll b=1;
while(t)
{
if(t&1) b=b*x%mod; x=x*x%mod; t>>=1;
}
return b;
}
void init()
{
fac[0]=1;
for(int i=1; i<=mx<<1; i++) fac[i]=1ll*fac[i-1]*i%mod;
unfac[mx<<1]=(int)power(fac[mx<<1],mod-2);
for(int i=(mx<<1)-1; i>=0; i--)
unfac[i]=1ll*unfac[i+1]*(i+1)%mod;
}
ll C(ll x,ll y)
{
if(x<y) return 0;
return 1ll*fac[x]*unfac[y]%mod*unfac[x-y]%mod;
}
int main()
{
freopen("b.in","r",stdin); freopen("b.out","w",stdout);
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
mx=500000;
init();
for(int i=0; i<=mx; i++)
{
f[i]=1ll*power(unfac[2],a[1]+i)*C(a[1]+i-1,i)%mod;
g[i]=1ll*f[i]*i%mod;
if(i) f[i]=(f[i]+f[i-1])%mod,g[i]=(g[i]+g[i-1])%mod;
}
ans=a[1];
for(int i=2; i<=n; i++) ans=(ans+g[a[i]]+1ll*(mod+1-f[a[i]])*a[i])%mod;
printf("%d\n",ans);
}