正题
luogu
CF1204E
题目大意
给出序列a,由n个1和m个-1组成,设 f 为最大前缀和和0的最大值,问全排列的 f 之和
解题思路
可以问题转换到平面图上,把1看作往上走,-1看作往下走
那么问题就变成了求 (0,0) 到 (n+m,n-m) 所有路径的y坐标最大值之和
可以考虑枚举最大y坐标,然后求方案数
先考虑如何强制经过 y=i 这条线,即到达这个高度(如果起点终点在这条线的异侧就不用操作了)
可以把 (0,0) 关于 y=i 对称,把 (0,2i) 走到 (n+m,n-m) 的路径后把 (0,2i) 到第一个经过 y=i 的点这段路径对称回来,就得到了一条强制经过 y=i 的路径,但是可能过了 y=i,容斥以下即可
综上方案数为
S={(n+mn)(i≤n)(n+mn−i)(i>n)S=\Large{\left\{\begin{matrix} \binom{n+m}{n} \quad (i\leq n)\\ \binom{n+m}{n-i} \quad (i>n)\end{matrix}\right.}S=⎩⎨⎧(nn+m)(i≤n)(n−in+m)(i>n)
code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define mod 998244853
#define N 100000
using namespace std;
ll ans,n,m,q[N],qpr[N],pr[N];
ll C(ll n,ll m)
{return pr[n]*qpr[n-m]%mod*qpr[m]%mod;
}
ll get(ll k)
{if(k<=n-m)return C(n+m,n);else return C(n+m,n-k);
}
int main()
{scanf("%lld%lld",&n,&m);qpr[0]=pr[0]=q[1]=qpr[1]=pr[1]=1;for(int i=2;i<=n+m;++i){q[i]=mod-mod/i*q[mod%i]%mod;qpr[i]=qpr[i-1]*q[i]%mod;;pr[i]=pr[i-1]*i%mod;}for(int i=1;i<=n;++i)(ans+=(get(i)-get(i+1)+mod)%mod*i%mod)%=mod;printf("%lld",ans);return 0;
}