首页 > 其他分享 >洛谷 P8367 - [LNOI2022] 盒(组合数学)

洛谷 P8367 - [LNOI2022] 盒(组合数学)

时间:2023-05-07 22:55:20浏览次数:37  
标签:LNOI2022 洛谷 dbinom limits int lim sum P8367 fac

设 \(a\) 数组的前缀和为 \(s_i\),\(b\) 数组的前缀和为 \(t_i\),那么根据模拟费用流或者贪心的思想,每一条边经过的次数即为 \(|s_i-t_i|\),因此非常 trivial 的做法是转换贡献体,枚举每种方案下每条边被经过的次数,然后乘以 \(w_i\) 求和,具体来说:

\[ans=\sum\limits_{i=1}^{n-1}\sum\limits_{j=0}^{s_n}w_i·\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·|s_i-j| \]

推一推:

\[ans=\sum\limits_{i=1}^{n-1}w_i·(\sum\limits_{j=0}^{s_n}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·(j-s_i)+2\sum\limits_{j=0}^{s_i}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·(s_i-j)) \]

发现等价于求以下两个东西:

\[f(i,lim)=\sum\limits_{j=0}^{lim}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1} \]

\[g(i,lim)=\sum\limits_{j=0}^{lim}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·j \]

先考虑对 \(g\) 进行一些转化使其变成与 \(f\) 形式类似的东西:

\[\begin{aligned} g(i,lim)&=\sum\limits_{j=0}^{lim}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·j\\ &=\sum\limits_{j=0}^{lim}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·((i+j)-i)\\ &=\sum\limits_{j=0}^{lim}\dbinom{i+j}{i}·\dbinom{n-i-1+s_n-j}{n-i-1}·i-\sum\limits_{j=0}^{lim}\dbinom{i-1+j}{i-1}·\dbinom{n-i-1+s_n-j}{n-i-1}·i \end{aligned} \]

其中第二步到第三步是吸收恒等式逆用。

\(i\) 是常数,去掉之后发现左右两边左右两边形式都和 \(f\) 类似,因此先考虑怎么求 \(f\)。发现 \(f\) 的组合意义是,有 \((n-1)\times s_n\) 的网格,从左下走到右上,每一步只能向上或向右,问有多少种走法,使得从第 \(i-1\) 列到第 \(i\) 列时经过的那条边的纵坐标 \(\le lim\)。

然后我就死在这里了,像个傻逼一样。

发现虽然 \(f\) 本身没有什么非常简洁的化简式,但是从 \(f(i,lim)\to f(i,lim+1)\) 的变化是容易的,直接加上经过 \((i-1,lim+1)\to (i,lim+1)\) 这条边的方案数即可。\(f(i,lim)\to f(i+1,lim)\) 也不难,发现后者合法的路径集合一定被前者包含,而二者相差的部分恰好都经过了 \((i,lim)\to (i,lim+1)\) 这条边,同样可以 \(O(1)\) 移动指针。而指针移动总次数是 \(O(n+S)\) 的,所以总复杂度也是这个。

const int MAXN=3e6;
const int MOD=998244353;
int fac[MAXN+5],ifac[MAXN+5];
void init_fac(int n){
	for(int i=(fac[0]=ifac[0]=ifac[1]=1)+1;i<=n;i++)ifac[i]=1ll*ifac[MOD%i]*(MOD-MOD/i)%MOD;
	for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%MOD,ifac[i]=1ll*ifac[i-1]*ifac[i]%MOD;
}
int binom(int n,int k){return 1ll*fac[n]*ifac[k]%MOD*ifac[n-k]%MOD;}
int n,s[MAXN+5],w[MAXN+5];
struct solver{
	int n,m,p,q,sum;
	void init(int N,int M){n=N;m=M;p=0;q=0;sum=binom(N+M-1,N-1);}
	void moveP(){++p;if(q!=m)sum=(sum-1ll*binom(p+q,p)*binom(n-p+m-q-1,n-p)%MOD+MOD)%MOD;}
	void moveQ(){++q;sum=(sum+1ll*binom(p+q,p)*binom(n-p-1+m-q,n-p-1))%MOD;}
	int at(int P,int Q){while(p<P)moveP();while(q<Q)moveQ();return sum;}
}A,B;
void solve(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&s[i]),s[i]+=s[i-1];
	for(int i=1;i<n;i++)scanf("%d",&w[i]);
	int res=0,T1=binom(s[n]+n-1,n-1),T2=binom(s[n]+n,n);
	A.init(n-1,s[n]);B.init(n,s[n]);
	for(int i=1;i<n;i++){
		int s1=A.at(i-1,s[i]),s2=B.at(i,s[i]);
		res=(res+1ll*(1ll*(T2-T1+MOD)*i%MOD-1ll*s[i]*T1%MOD+2ll*s[i]*s1%MOD-2ll*(s2-s1+MOD)*i%MOD+MOD+MOD)*w[i])%MOD;
	}
	printf("%d\n",res);
}
int main(){init_fac(MAXN);int qu;scanf("%d",&qu);while(qu--)solve();return 0;}

标签:LNOI2022,洛谷,dbinom,limits,int,lim,sum,P8367,fac
From: https://www.cnblogs.com/tzcwk/p/luogu-P8367.html

相关文章

  • 洛谷 P3369 【模板】普通平衡树
    有旋Treap模板#include<bits/stdc++.h>usingnamespacestd;structNode{ Node*ch[2]; intval,rank; intrep_cnt; intsiz; Node(intval):val(val),rep_cnt(1),siz(1){ ch[0]=ch[1]=nullptr; rank=rand(); } voidupd_siz(){ siz=......
  • 洛谷P4824题解
    题面题意:给出字符串s和t,每次操作将s中出现的第一个t删去,直到不能删为止。求最后的串。|s|<=1e6题解:hash做法。(此题也有kmp和权值线段树做法)因为涉及到删除操作,所以我们要动态的实现这个过程。所以考虑开一个栈来存储当前留下的字符。然后每有一个字符入栈,就拿当前......
  • 洛谷P7469题解
    题面题意:有两个字符串a和b,问b中有多少个本质不同子串可以由a删除若干个字符得到。|a|,|b|<=3000题解:字典树(这个题做法很多,后补)。把字符串b的每个子串打到字典树上。然后因为3000^2*26这个东西比较大,所以不能用nxt[id][26]来存储,于是使用链式前向星存图,这样tri......
  • 洛谷 P6938 - [ICPC2017 WF]Son of Pipe Stream(网络流)
    见过的最怪的网络流题,没有之一。首先新建超级源点,向\(1,2\)各连\(\infty\)的边。设最大流为\(A\),那么显然最优方案中flutter和water流量之和为\(A\)。先分析一波答案函数。显然,最终答案关于flutter的流量\(x\)的函数\(f(x)=x^a(A-x)^{1-a}\)。求导得\(f'(x)=ax^......
  • 洛谷 P7579 「RdOI R2」称重(weigh) 题解
    题意:题目一道交互题。有n个球,里面有两个假球,假球比普通球的要轻,每次可以询问任意两组球的轻重关系,第一组轻为<,第二组轻为>,一样重量为=。思路:先考虑在一个区间内找1个假球。我们可以将区间尽量平均分为3份,先询问相等的两组球的轻重关系,分3种情况:第一组轻......
  • 【做题笔记】洛谷 P7987 [USACO21DEC] Paired Up G
    在我的个人博客获得更好的阅读体验Problem洛谷P7987[USACO21DEC]PairedUpG题目大意:有\(n\)个点,其中第\(i\)个点位置为\(x_i\),权值为\(y_i\)。若两个点\(i,j\)满足\(|x_i-x_j|\lek\),则这两个点之间有一条边。求一个匹配,在满足其为极大匹配的情况下匹配点的......
  • 洛谷 P3374——树状数组 / 树状数组模板题
    洛谷P3374——树状数组#include<iostream>usingnamespacestd;constintN=5e5+10;inttr[N],a[N];intn,m;intlowbit(intx){returnx&-x;}voidadd(intu,intc){//给所有管辖中有a[i]的tr[]加上cfor(inti=u;i<=n;i+......
  • 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法
    在做这道题之前我们先了解一下棋盘问题棋盘问题(qq.com)......
  • 洛谷:P5716日份天数
    题目描述输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。输入格式输入两个正整数,分别表示年份\(y\)和月数\(m\),以空格隔开。输出格式输出一行一个正整数,表示这个月有多少天。样例#1样例输入#119268样例输出#131样例输入#220002样例输出#229......
  • 洛谷 P1007 独木桥
    题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳 11 个人通过。假如有 2......