Natasha, Sasha and the Prefix Sums

liyixin發表於2024-10-15

Natasha, Sasha and the Prefix Sums

\(g(x)\) 表示 \(f(a)=x\) 的個數,那麼 \(ans=\sum_{x=\max(0,n-m)}^{n} xg_x\)

恰好不好求,我們求 \(h(x)\) 表示 \(f(a)\le x\) 的個數,\(g(x)=h(x)-h(x-1)\)

1 表示向上走,-1 表示向下走,\(h_i\) 就是求從 \((0,0)\) 走到 \((n+m,n-m)\) 且始終 \(cnt(1)-cnt(-1)\le i\),即 \(y\le i\),即不超過直線 \(y=i\)

\(h_i=\binom{n+m}{n}-\binom{n+m}{i+1+m}\)

求出 \(h_i\) 再求出 \(g_i\) 進而求出 \(ans\)

時間複雜度 \(O(n)\)

Code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
const int N=2008,mod=998244853;
int n,m;
ll jc[N<<3];
void init(int n){
	jc[0]=1;
	for(int i=1;i<=n;i++){
		jc[i]=jc[i-1]*i%mod;
	}
}
ll ksm(ll a,ll b){
	ll s=1;
	while(b){
		if(b&1){
			s=s*a%mod;
		}
		a=a*a%mod;
		b>>=1;
	}
	return s;
}
ll C(ll n,ll m){
//	if(m<0||n<m) return 0;
	return jc[n]*ksm(jc[n-m]*jc[m]%mod,mod-2)%mod;
}
//ll h(ll x,ll y){
//	return C(x,((x+y)/2>=0&&(x+y)/2<=x?(x+y)/2:(x-y)/2));
//}
ll g[N],f[N];
ll get_g(ll k){
//	if(k<n-m){
//		return 0;
//	}
	return (C(n+m,m)-C(n+m,m+k+1)+mod)%mod;
//	return (h(n+m,n-m)-h(n+m,2*k+2-(n-m))+mod)%mod;
}
ll ans;
void add(ll &a,ll b){
	a=(a+b)%mod;
}
int main(){
//	freopen("shuju.txt","r",stdin);
//	freopen("my.out","w",stdout);
	sf("%d%d",&n,&m);
	init(N<<2);
	for(int i=max(1,n-m)-1;i<=n;i++){
		g[i]=get_g(i);
	}
	for(int i=max(1,n-m);i<=n;i++){
		f[i]=(g[i]-g[i-1]+mod)%mod;
		add(ans,i*f[i]%mod);
	}
	pf("%lld\n",ans);
}

相關文章