无链接
题目描述
题解
因为保证了输入的区间不相交且有序,所以我们可以直接列出集合的生成函数:
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=1∑n(xli+xli+1+...+xri)=i=1∑n1−xxli−xri+1=1−x1i=1∑nxli−xri+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} Ans1∼5 表示五个部分的答案: [ 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} 1−x1,那么 ( ∑ i = 1 n x l i − x r i + 1 ) 4 (\sum_{i=1}^n x^{l_i}-x^{r_i+1})^4 (∑i=1nxli−xri+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 (1−x)k1=∑i=0+∞(k−1i+k−1)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(n2∼n2logn) 的复杂度,所以考虑折半优化。
设
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)=(1−x)21∑cixvi,那么
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=i∑vi+vj≤s∑cicj(3s−vi−vj+3)
我们设
s
i
=
s
−
v
i
+
2
s_i=s-v_i+2
si=s−vi+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=i∑vi+vj≤s∑cicj(3si−vj+1)=i∑vi+vj≤s∑cicj6(si−vj+1)(si−vj)(si−vj−1)=i∑vi+vj≤s∑cicj6(si−vj)3−(si−vj)=61i∑vi+vj≤s∑cicj(si−vj)3−sici⋅cj+ci⋅vjcj=61i∑(vi+vj≤s∑ci⋅cjvj−sici⋅cj+(cisi3⋅cj−3cisi2⋅cjvj+3cisi⋅cjvj2−ci⋅cjvj3))=61i∑vi+vj≤s∑(cisi3−cisi)⋅cj+(ci−3cisi2)⋅cjvj+3cisi⋅cjvj2−ci⋅cjvj3
推到这一步,我们发现乘号两边分别只与
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)=1−x21∑cjxvj,并且仍然设
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)=(1−x)21∑cixvi(这里仅用下角标作了区分),那么有
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)⋅i∑vi+vj≤s∑cicjh(s−vi−vj)其中
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](1−x2)(1−x)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=s−vi,那么有
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)⋅i∑vi+vj≤s∑cicjh(si−vj)=(−23)⋅i∑vi+vj≤s∑cicj((si−vj)2+4(si−vj)+3+[si≡vjmod2])=(−23)⋅i∑(vi+vj≤s∑cicj(si2−2sivj+vj2+4si−4vj+3)+ci⋅(vi+vj≤s,si≡vjmod2∑cj))=(−23)⋅i∑(vi+vj≤s∑cisi2⋅cj−2cisi⋅cjvj+ci⋅cjvj2+4cisi⋅cj−4ci⋅cjvj+3cicj+ci⋅(vi+vj≤s,si≡vjmod2∑cj))=(−23)⋅i∑(vi+vj≤s∑(cisi2+4cisi+3ci)⋅cj+(−2cisi−4ci)⋅cjvj+ci⋅cjvj2+ci⋅(vi+vj≤s,si≡vjmod2∑cj))然后我们发现前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} 1−x1 部分)都不超过 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;
}