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

説明

ここに画像を挿入説明

入力

ここに画像を挿入説明

出力

ここに画像を挿入説明

サンプル入力

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);
} 
703元記事公開 ウォンの賞賛392 ビューに14万+を

おすすめ

転載: blog.csdn.net/Eric1561759334/article/details/100586564