CF1204Eナターシャ、サーシャとプリフィックス和题解

CF1204Eナターシャ、サーシャとプリフィックス和

描画兄のブログを

探している\(N- \)\(1 \)\(m個の\を)- (1 \)\の最大プレフィックス系列を形成し、すべての合計である、\(N、Mの\ leqslantの1E6の\)

セット\(F [i]が\)、Iに正確に等しい最大数プレフィックスと配列を表す最終的な答えである([I] \ iは=ニッケル・F {^} \ sum_。1)\次の包含および除外を使用して、求めている\(F [I] \)

セット\(G [i]が\) I、最大プレフィクスおよび数配列に正確に一致を表す([I] = G F \ -g [I] \ [I + 1])

次に座標系上の\(1 + \)\( - 1 \)配列の各々から上方として\((0,0)\)する\((N、M)\ ) パス

そして最大必要プレフィックス以上\(K \) すなわち、プレゼンスある\(XY \ geqslant K \)
、パスをしなければならない\(Y = XKの\)

すなわちから\((0,0)\)する\((N、M)\ ) を通る直線\(Y = XK \)パスの数である\(G [K] \)

\((0,0)\)\(Y = XK \)得対称\((K、-k)\ ) 、次いで\((K、-k)を\ ) する((N、M)\ \)パス数は、所望されます

精製し\(G [K] =( N + M、NK-1)\)

\(F [K] = G [K + 1] -g [K] = \ binom {N + M} {NK} - \ binom {N + M} {NK-1} \)

これは、ことに留意すべきである(\ fは、G \)が定義されている:場合(K \ leqslant NM \)\プレフィックスとするため、可能な最大\(K \)、\ (F [K] \)\(0 \)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <cctype>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;

#define inf 0x3f3f3f3f
typedef long long LL;
#define cls(x) memset(x,0,sizeof(x))
#define For(i,j,k) for(register int i=(j);i<=(k);++i)
#define Rep(i,j,k) for(register int i=(j);i>=(k);--i)
#define rint register int
#define il inline
il int read(int x=0,int f=1,char ch='0')
{
    while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
    while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
    return f*x;
}

const int N=2e6+5,mod=998244853;
LL fac[N],ifac[N],ans;
il LL C(int n,int m) { return fac[n]*ifac[n-m]%mod*ifac[m]%mod; }
il LL qpow(LL a,LL b) { LL ret=1; for(;b;b>>=1) {if(b&1) ret=ret*a%mod; a=a*a%mod;} return ret; }
int n,m;

//\binom{n+m}{n-k}-\binom{n+m}{n-k-1}
int main()
{
    // freopen("maxpsum.in","r",stdin);
    // freopen("maxpsum.out","w",stdout);
    n=read(); m=read(); ans=n; fac[0]=ifac[0]=1; 
    For(i,1,n+m) fac[i]=1ll*fac[i-1]*i%mod; 
    ifac[n+m]=qpow(fac[n+m],mod-2); Rep(i,n+m-1,1) ifac[i]=1ll*(i+1)*ifac[i+1]%mod;
    For(i,max(n-m,0),n-1) ans=(ans+1ll*i*(C(n+m,n-i)-C(n+m,n-i-1)+mod)%mod)%mod;
    printf("%lld\n",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/wmq12138/p/11721710.html