【2022省选模拟】题目名称——容斥、生成函数

无链接

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题解

因为保证了输入的区间不相交且有序,所以我们可以直接列出集合的生成函数:
G ( x ) = ∑ i = 1 n ( x l i + x l i + 1 + . . . + x r i ) = ∑ i = 1 n x l i − x r i + 1 1 − x = 1 1 − x ∑ i = 1 n x l i − x r i + 1 G(x)=\sum_{i=1}^n(x^{l_i}+x^{l_i+1}+...+x^{r_i})\\ =\sum_{i=1}^n\frac{x^{l_i}-x^{r_i+1}}{1-x}\\ =\frac{1}{1-x}\sum_{i=1}^n x^{l_i}-x^{r_i+1}\\ G(x)=i=1n(xli+xli+1+...+xri)=i=1n1xxlixri+1=1x1i=1nxlixri+1
然后,我们容斥一下(省略非常复杂的讨论),得出答案的生成函数:
F 4 ( x ) = 1 24 (   G 4 ( x )   − 6 G ( x 2 ) G 2 ( x )   + 3 G 2 ( x 2 )   + 8 G ( x 3 ) G ( x )   − 6 G ( x 4 )   ) F_4(x)=\frac{1}{24}(\,G^4(x)\,-6G(x^2)G^2(x)\,+3G^2(x^2)\,+8G(x^3)G(x)\,-6G(x^4)\,) F4(x)=241(G4(x)6G(x2)G2(x)+3G2(x2)+8G(x3)G(x)6G(x4))
我们的目的是求 [ x s ] F 4 ( x ) [x^s]F_4(x) [xs]F4(x),显然可以把上面五个部分分开来求。

(为了方便定义,我们用 A n s 1 ∼ 5 Ans_{1\sim 5} Ans15 表示五个部分的答案: [ x s ] F 4 ( x ) = 1 24 ( A n s 1 + A n s 2 + A n s 3 + A n s 4 + A n s 5 ) [x^s]F_4(x)=\frac{1}{24}(Ans_1+Ans_2+Ans_3+Ans_4+Ans_5) [xs]F4(x)=241(Ans1+Ans2+Ans3+Ans4+Ans5)


[ x s ] G 4 ( x ) [x^s]G^4(x) [xs]G4(x)

先说第一部分吧,我们不妨先忽略掉 G G G 中的 1 1 − x \frac{1}{1-x} 1x1,那么 ( ∑ i = 1 n x l i − x r i + 1 ) 4 (\sum_{i=1}^n x^{l_i}-x^{r_i+1})^4 (i=1nxlixri+1)4 的项数是 n 4 n^4 n4 级别的。而我们知道 1 ( 1 − x ) k = ∑ i = 0 + ∞ ( i + k − 1 k − 1 ) x i \frac{1}{(1-x)^k}=\sum_{i=0}^{+\infty}{i+k-1\choose k-1}x^i (1x)k1=i=0+(k1i+k1)xi,所以我们可以暴力求出 n 4 n^4 n4 项后再枚举算出 x s x^s xs 处的系数。

然而题目只允许 O ( n 2 ∼ n 2 log ⁡ n ) O(n^2\sim n^2\log n) O(n2n2logn) 的复杂度,所以考虑折半优化。

G 2 ( x ) = 1 ( 1 − x ) 2 ∑ c i x v i G^2(x)=\frac{1}{(1-x)^2}\sum c_ix^{v_i} G2(x)=(1x)21cixvi,那么
A n s 1 = ∑ i ∑ v i + v j ≤ s c i c j ( s − v i − v j + 3 3 ) Ans_1=\sum_{i}\sum_{v_i+v_j\le s}c_ic_j{s-v_i-v_j+3 \choose 3} Ans1=ivi+vjscicj(3svivj+3)
我们设 s i = s − v i + 2 s_i=s-v_i+2 si=svi+2,那么就可以继续拆式子:
A n s 1 = ∑ i ∑ v i + v j ≤ s c i c j ( s i − v j + 1 3 ) = ∑ i ∑ v i + v j ≤ s c i c j ( s i − v j + 1 ) ( s i − v j ) ( s i − v j − 1 ) 6 = ∑ i ∑ v i + v j ≤ s c i c j ( s i − v j ) 3 − ( s i − v j ) 6 = 1 6 ∑ i ∑ v i + v j ≤ s c i c j ( s i − v j ) 3 − s i c i ⋅ c j + c i ⋅ v j c j = 1 6 ∑ i ( ∑ v i + v j ≤ s c i ⋅ c j v j − s i c i ⋅ c j    +    ( c i s i 3 ⋅ c j − 3 c i s i 2 ⋅ c j v j + 3 c i s i ⋅ c j v j 2 − c i ⋅ c j v j 3 )   ) = 1 6 ∑ i ∑ v i + v j ≤ s ( c i s i 3 − c i s i ) ⋅ c j + ( c i − 3 c i s i 2 ) ⋅ c j v j + 3 c i s i ⋅ c j v j 2 − c i ⋅ c j v j 3 Ans_1=\sum_{i}\sum_{v_i+v_j\le s}c_ic_j{s_i-v_j+1 \choose 3}\\ =\sum_i\sum_{v_i+v_j\le s}c_ic_j\frac{(s_i-v_j+1)(s_i-v_j)(s_i-v_j-1)}{6}\\ =\sum_i\sum_{v_i+v_j\le s}c_ic_j\frac{(s_i-v_j)^3-(s_i-v_j)}{6}\\ =\frac{1}{6}\sum_i\sum_{v_i+v_j\le s}c_ic_j(s_i-v_j)^3-s_ic_i\cdot c_j+c_i\cdot v_jc_j\\ =\frac{1}{6}\sum_i(\sum_{v_i+v_j\le s} c_i\cdot c_jv_j-s_ic_i\cdot c_j\,\,+\,\, (c_is_i^3\cdot c_j-3c_is_i^2\cdot c_jv_j+3c_is_i\cdot c_jv_j^2-c_i\cdot c_jv_j^3) \,)\\ =\frac{1}{6}\sum_i\sum_{v_i+v_j\le s}(c_is_i^3-c_is_i)\cdot c_j+(c_i-3c_is_i^2)\cdot c_jv_j+3c_is_i\cdot c_jv_j^2-c_i\cdot c_jv_j^3\\ Ans1=ivi+vjscicj(3sivj+1)=ivi+vjscicj6(sivj+1)(sivj)(sivj1)=ivi+vjscicj6(sivj)3(sivj)=61ivi+vjscicj(sivj)3sicicj+civjcj=61i(vi+vjscicjvjsicicj+(cisi3cj3cisi2cjvj+3cisicjvj2cicjvj3))=61ivi+vjs(cisi3cisi)cj+(ci3cisi2)cjvj+3cisicjvj2cicjvj3
推到这一步,我们发现乘号两边分别只与 i , j i,j i,j 有关,所以我们可以双指针,在枚举 i i i 的同时维护一下 j j j 的各项的和即可。

至此,时间降为 O ( n 2 ) O(n^2) O(n2)

[ x s ] ( − 6 G ( x 2 ) G 2 ( x ) ) [x^s](-6G(x^2)G^2(x)) [xs](6G(x2)G2(x))

这部分其实和上面的类似,由于直接做是 O ( n 3 ) O(n^3) O(n3),我们需要折半成 G ( x 2 ) G 2 ( x ) G(x^2)G^2(x) G(x2)G2(x) 来考虑。

G ( x 2 ) = 1 1 − x 2 ∑ c j x v j G(x^2)=\frac{1}{1-x^2}\sum c_jx^{v_j} G(x2)=1x21cjxvj,并且仍然设 G 2 ( x ) = 1 ( 1 − x ) 2 ∑ c i x v i G^2(x)=\frac{1}{(1-x)^2}\sum c_ix^{v_i} G2(x)=(1x)21cixvi(这里仅用下角标作了区分),那么有
A n s 2 = ( − 6 ) ⋅ ∑ i ∑ v i + v j ≤ s c i c j   h ( s − v i − v j ) Ans_2=(-6)\cdot\sum_{i}\sum_{v_i+v_j\le s}c_ic_j\,h(s-v_i-v_j) Ans2=(6)ivi+vjscicjh(svivj)其中
h ( d ) = [ x d ] 1 ( 1 − x 2 ) ( 1 − x ) 2 = [ x d ] ( ∑ i = 0 + ∞ x 2 i ) ⋅ ( ∑ i = 0 + ∞ ( i + 1 ) x i ) h(d)=[x^d]\frac{1}{(1-x^2)(1-x)^2}=[x^d](\sum_{i=0}^{+\infty}x^{2i})\cdot(\sum_{i=0}^{+\infty}(i+1)x^i) h(d)=[xd](1x2)(1x)21=[xd](i=0+x2i)(i=0+(i+1)xi)我们通过找规律进一步推导发现:
h ( x ) = 1 4 ( x 2 + 4 x + 3 + [ x   i s   e v e n ] ) h(x)=\frac{1}{4}(x^2+4x+3+[x\,is\,even]) h(x)=41(x2+4x+3+[xiseven])所以我们不妨再设 s i = s − v i s_i=s-v_i si=svi,那么有
A n s 2 = ( − 6 ) ⋅ ∑ i ∑ v i + v j ≤ s c i c j   h ( s i − v j ) = ( − 3 2 ) ⋅ ∑ i ∑ v i + v j ≤ s c i c j (   ( s i − v j ) 2 + 4 ( s i − v j ) + 3 + [ s i ≡ v j   m o d   2 ]   ) = ( − 3 2 ) ⋅ ∑ i ( ∑ v i + v j ≤ s c i c j ( s i 2 − 2 s i v j + v j 2 + 4 s i − 4 v j + 3 ) + c i ⋅ ( ∑ v i + v j ≤ s , s i ≡ v j   m o d   2 c j )   ) = ( − 3 2 ) ⋅ ∑ i ( ∑ v i + v j ≤ s c i s i 2 ⋅ c j − 2 c i s i ⋅ c j v j + c i ⋅ c j v j 2 + 4 c i s i ⋅ c j − 4 c i ⋅ c j v j + 3 c i c j + c i ⋅ ( ∑ v i + v j ≤ s , s i ≡ v j   m o d   2 c j )   ) = ( − 3 2 ) ⋅ ∑ i ( ∑ v i + v j ≤ s ( c i s i 2 + 4 c i s i + 3 c i ) ⋅ c j + ( − 2 c i s i − 4 c i ) ⋅ c j v j + c i ⋅ c j v j 2 + c i ⋅ ( ∑ v i + v j ≤ s , s i ≡ v j   m o d   2 c j )   ) Ans_2=(-6)\cdot\sum_{i}\sum_{v_i+v_j\le s}c_ic_j\,h(s_i-v_j)\\ =(-\frac{3}{2})\cdot\sum_{i}\sum_{v_i+v_j\le s}c_ic_j(\,(s_i-v_j)^2+4(s_i-v_j)+3+[s_i\equiv v_j\bmod 2]\,)\\ =(-\frac{3}{2})\cdot\sum_{i}(\sum_{v_i+v_j\le s}c_ic_j(s_i^2-2s_iv_j+v_j^2+4s_i-4v_j+3)+c_i\cdot (\sum_{v_i+v_j\le s,s_i\equiv v_j\bmod 2}c_j)\,)\\ =(-\frac{3}{2})\cdot\sum_{i}(\sum_{v_i+v_j\le s}c_is_i^2\cdot c_j-2c_is_i\cdot c_jv_j+c_i\cdot c_jv_j^2+4c_is_i\cdot c_j-4c_i\cdot c_jv_j+3c_ic_j+c_i\cdot (\sum_{v_i+v_j\le s,s_i\equiv v_j\bmod 2}c_j)\,)\\ =(-\frac{3}{2})\cdot\sum_{i}(\sum_{v_i+v_j\le s}(c_is_i^2+4c_is_i+3c_i)\cdot c_j+(-2c_is_i-4c_i)\cdot c_jv_j+c_i\cdot c_jv_j^2+c_i\cdot (\sum_{v_i+v_j\le s,s_i\equiv v_j\bmod 2}c_j)\,)\\ Ans2=(6)ivi+vjscicjh(sivj)=(23)ivi+vjscicj((sivj)2+4(sivj)+3+[sivjmod2])=(23)i(vi+vjscicj(si22sivj+vj2+4si4vj+3)+ci(vi+vjs,sivjmod2cj))=(23)i(vi+vjscisi2cj2cisicjvj+cicjvj2+4cisicj4cicjvj+3cicj+ci(vi+vjs,sivjmod2cj))=(23)i(vi+vjs(cisi2+4cisi+3ci)cj+(2cisi4ci)cjvj+cicjvj2+ci(vi+vjs,sivjmod2cj))然后我们发现前3项的前后都分别只与 i , j i,j i,j 有关,可以用同样的双指针做法,而第4项后边也只与 s i s_i si 的奇偶性有关,在双指针的同时对两种奇偶性分别记录一下即可。这么做也是 O ( n 2 ) O(n^2) O(n2)

[ x s ] 3 G 2 ( x 2 ) , [ x s ] 8 G ( x 3 ) G ( x ) , [ x s ] ( − 6 G ( x 4 ) ) [x^s]3G^2(x^2),[x^s]8G(x^3)G(x),[x^s](-6G(x^4)) [xs]3G2(x2),[xs]8G(x3)G(x),[xs](6G(x4))

我们发现这三部分的函数的项数(去掉 1 1 − x \frac{1}{1-x} 1x1 部分)都不超过 n 2 n^2 n2,所以直接暴力枚举即可。


最终复杂度是 O ( n 2 ) O(n^2) O(n2) 的,我为了实现方便就用了 m a p \rm map map,多了一个 log ⁡ n \log n logn

代码

#include<bits/stdc++.h>//JZM yyds!!
#define ll long long
#define uns unsigned
#define IF (it->first)
#define IS (it->second)
#define END putchar('\n')
using namespace std;
const int MAXN=805;
const ll INF=1e17;
inline ll read(){
	ll x=0;bool f=1;char s=getchar();
	while((s<'0'||s>'9')&&s>0){if(s=='-')f^=1;s=getchar();}
	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=getchar();
	return f?x:-x;
}
int ptf[50],lpt;
inline void print(ll x,char c='\n'){
	if(x<0)putchar('-'),x=-x;
	ptf[lpt=1]=x%10;
	while(x>9)x/=10,ptf[++lpt]=x%10;
	while(lpt)putchar(ptf[lpt--]^48);
	if(c>0)putchar(c);
}
inline ll lowbit(ll x){return x&-x;}

const ll MOD=998244353;
inline ll ksm(ll a,ll b,ll mo){
	ll res=1;
	for(;b;b>>=1,a=a*a%mo)if(b&1)res=res*a%mo;
	return res;
}
const ll iv6=ksm(6,MOD-2,MOD),iv4=ksm(4,MOD-2,MOD);
int n;
ll s,l[MAXN],r[MAXN],ans1,ans2,ans3,ans4,ans5;
map<ll,ll>G2;
#define pll pair<ll,ll>
#define fi first
#define se second
vector<pll>a,b;
inline void ad(ll&a,ll b){a+=b;if(a>=MOD)a-=MOD;}
signed main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
	n=read(),s=read();
	for(int i=1;i<=n;i++)l[i]=read(),r[i]=read();
	r[0]=-233;
	for(int i=1;i<=n;i++){
		if(l[i]==r[i-1]+1)ad(b[b.size()-1].se,1);
		else b.emplace_back(pll(l[i],1));
		b.emplace_back(pll(r[i]+1,MOD-1));
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			ad(G2[l[i]+l[j]],1);
			ad(G2[l[i]+r[j]+1],MOD-1);
			ad(G2[r[i]+1+l[j]],MOD-1);
			ad(G2[r[i]+r[j]+2],1);
		}
	for(auto it:G2)a.push_back(it);
	{//get ans1
		ll cj=0,cjvj=0,cjvj2=0,cjvj3=0;
		for(int lim=a.size(),i=lim-1,j=0;i>=0;i--){
			while(j<lim&&a[i].fi+a[j].fi<=s){
				ll CJ=a[j].se,VJ=a[j].fi;
				ad(cj,CJ),ad(cjvj,CJ*VJ%MOD),ad(cjvj2,CJ*VJ%MOD*VJ%MOD);
				ad(cjvj3,CJ*VJ%MOD*VJ%MOD*VJ%MOD),j++;
			}
			if(a[i].fi>s)continue;
			ll si=s-a[i].fi+2,d=0,ci=a[i].se;
			ad(d,ci*si%MOD*(si*si%MOD+MOD-1)%MOD * cj%MOD);
			ad(d,ci*(MOD+1-si*si%MOD*3%MOD)%MOD * cjvj%MOD);
			ad(d,3*ci%MOD*si%MOD * cjvj2%MOD);
			ad(d,(MOD-ci) * cjvj3%MOD);
			ad(ans1,d*iv6%MOD);
		}
	}
	{//get ans2
		ll cj=0,cjvj=0,cjvj2=0,jc[2]={0,0};
		for(int lim=b.size(),i=a.size()-1,j=0;i>=0;i--){
			while(j<lim&&a[i].fi+(b[j].fi<<1)<=s){
				ll CJ=b[j].se,VJ=b[j].fi<<1;
				ad(cj,CJ),ad(cjvj,CJ*VJ%MOD);
				ad(cjvj2,CJ*VJ%MOD*VJ%MOD);
				ad(jc[VJ&1],CJ),j++;
			}
			if(a[i].fi>s)continue;
			ll si=s-a[i].fi,d=0,ci=a[i].se;
			ad(d,(ci*si%MOD*(si+4)%MOD+ci*3)%MOD * cj%MOD);
			ad(d,((MOD<<1)-(ci*si<<1)%MOD-(ci<<2)%MOD)%MOD * cjvj%MOD);
			ad(d,ci * cjvj2%MOD),ad(d,ci * jc[si&1]%MOD);
			ad(ans2,d*iv4%MOD);
		}ans2=ans2*(MOD-6)%MOD;
	}
	{//get ans3
		for(auto it:a){
			if((it.fi<<1)>s||(s&1))break;
			ad(ans3,it.se*((s>>1)-it.fi+1ll)%MOD);
		}ans3=ans3*3%MOD;
	}
	{//get ans4
		for(int lim=b.size(),i=0;i<lim;i++)
			for(int j=0;j<lim;j++){
				if(b[i].fi*3+b[j].fi>s)break;
				ll d=b[i].se*b[j].se%MOD,e=s-b[i].fi*3-b[j].fi;
				ad(ans4,d*(e/3+1)%MOD);
			}ans4=(ans4<<3)%MOD;
	}
	{//get ans5
		for(auto it:b){
			if((s&3)||(it.fi<<2)>s)break;
			ad(ans5,it.se);
		}ans5=ans5*(MOD-6)%MOD;
	}
	print((ans1+ans2+ans3+ans4+ans5)%MOD*iv4%MOD*iv6%MOD);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值