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);
}