LOJ#6247. 九个太阳(单位根反演)
给定
n
≤
1
0
15
,
k
≤
2
20
n\le10^{15},k\le2^{20}
n≤1015,k≤220,
k
k
k 是 2 的幂,求:
∑
k
∣
i
,
0
≤
i
≤
n
(
n
i
)
\sum_{k|i,0\le i\le n}\binom ni
k∣i,0≤i≤n∑(in) 单位根反演
相当于就是求 f ( x ) = ∑ i = 0 n ( n i ) x i = ( x + 1 ) n f(x)=\sum_{i=0}^n \binom nix^i=(x+1)^n f(x)=∑i=0n(in)xi=(x+1)n 的 k k k 的倍数项的系数和,单位根反演后等于 1 k ∑ j = 0 k − 1 f ( w j k ) = 1 k ∑ j = 0 k − 1 ( w j k + 1 ) n \frac 1k\sum\limits_{j=0}^{k-1}f(w_{j}^k)=\frac 1k\sum\limits_{j=0}^{k-1}(w_j^k+1)^n k1j=0∑k−1f(wjk)=k1j=0∑k−1(wjk+1)n
LOJ#556. 「Antileaf’s Round」咱们去烧菜吧(多重背包乘积lnexp优化)
m m m 种物品,每种大小 a i a_i ai,数量 b i b_i bi,求装满大小为 k ∈ [ 1 , n ] k\in[1,n] k∈[1,n] 的背包的方案数。 b i = 0 b_i=0 bi=0 表示无限。 1 ≤ a i < 110000 , 0 ≤ b i ≤ 1 0 6 , 1 ≤ n , m ≤ 1 0 5 1\le a_i<110000,0\le b_i\le10^6,1\le n,m\le10^5 1≤ai<110000,0≤bi≤106,1≤n,m≤105
对 b i = 0 b_i=0 bi=0,有 F i = 1 1 − x a i F_i=\frac 1{1-x^{a_i}} Fi=1−xai1;对 b i ≠ 0 b_i\neq 0 bi=0,有 F i = 1 − x a i ( b i + 1 ) 1 − x a i F_i={1-x^{a_i(b_i+1)}\over 1-x^{a_i}} Fi=1−xai1−xai(bi+1)
答案的生成函数 G = ∏ F i = exp ∑ ln F i G=\prod F_i=\exp\sum\ln F_i G=∏Fi=exp∑lnFi
ln 1 − x a i ( b i + 1 ) 1 − x a i = ln ( 1 − x a i ( b i + 1 ) ) − ln ( 1 − x a i ) \ln{1-x^{a_i(b_i+1)}\over 1-x^{a_i}}=\ln (1-x^{a_i(b_i+1)})-\ln(1-x^{a_i}) ln1−xai1−xai(bi+1)=ln(1−xai(bi+1))−ln(1−xai)
ln ( 1 − x ) = ∑ i = 1 ∞ − 1 i x i \ln(1-x)=\sum_{i=1}^\infty-\frac 1ix^i ln(1−x)=∑i=1∞−i1xi,所以 ln F i \ln F_i lnFi 是某些位置的倍数的形式,可以先求出每个位置的贡献和,然后 O ( n ln n ) O(n\ln n) O(nlnn) 求出 ∑ ln F i \sum\ln F_i ∑lnFi。
CF1096G Lucky Tickets
多项式快速幂模板题,次数 k ≤ 9 k\le9 k≤9, n ≤ 1 0 5 n\le10^5 n≤105,可以求导递推,可以点值快速幂。
LOJ#6703. 小 Q 的序列(组合意义神题)
dalao题解
里面的
f
i
,
Δ
=
f
i
−
1
,
Δ
−
1
+
(
a
i
+
i
−
Δ
)
∗
f
i
−
1
,
Δ
f_{i,\Delta}=f_{i-1,\Delta-1}+(a_i+i-\Delta)*f_{i-1,\Delta}
fi,Δ=fi−1,Δ−1+(ai+i−Δ)∗fi−1,Δ
那么
f
n
,
Δ
f_{n,\Delta}
fn,Δ 相当于是有
n
−
Δ
n-\Delta
n−Δ 个数的贡献为
a
i
+
i
a_i+i
ai+i,然后乘上按照
g
i
,
j
=
g
i
−
1
,
j
−
1
−
j
∗
g
i
−
1
,
j
g_{i,j}=g_{i-1,j-1}-j*g_{i-1,j}
gi,j=gi−1,j−1−j∗gi−1,j 递推得到的
g
n
,
Δ
g_{n,\Delta}
gn,Δ
求
g
g
g 很像第二类斯特林数·列(就是)
AT2064 [AGC005F] Many Easy Problems
n
n
n个点的树,对每个
k
k
k,求任选
k
k
k个点,包含这
k
k
k个点的最小连通块大小之和。
n
≤
200000
n\le200000
n≤200000
连通块边数=点数-1,考虑每条边对 a n s k ans_k ansk的贡献然后加上 ( n k ) \binom nk (kn)即可。
选 k k k个点,某条边 i i i在这个最小连通块中的方案数是 ( n k ) − ( s z k ) − ( n − s z k ) \binom nk-\binom {sz}k-\binom {n-sz}k (kn)−(ksz)−(kn−sz)
假设以1为根, a n s k = n ∗ ( n k ) − ( ∑ i = 2 n ( s z i k ) + ( n − s z i k ) ) ans_k=n*\binom nk-(\sum_{i=2}^n\binom {sz_i}k+\binom {n-sz_i}k) ansk=n∗(kn)−(∑i=2n(kszi)+(kn−szi))
记
c
n
t
i
=
∑
[
s
z
j
=
=
i
]
+
[
n
−
s
z
j
=
=
i
]
cnt_i=\sum[sz_j==i]+[n-sz_j==i]
cnti=∑[szj==i]+[n−szj==i],那么后面那个式子可以记为
f
k
=
∑
i
=
1
n
−
1
(
i
k
)
∗
c
n
t
i
f_k=\sum_{i=1}^{n-1}\binom ik*cnt_i
fk=∑i=1n−1(ki)∗cnti
组合数拆开得到
f
k
∗
k
!
=
∑
i
=
1
n
−
1
i
!
⋅
c
n
t
i
∗
1
(
i
−
k
)
!
f_k*k!=\sum_{i=1}^{n-1}i!\cdot cnt_i*\frac 1{(i-k)!}
fk∗k!=∑i=1n−1i!⋅cnti∗(i−k)!1。翻转后做卷积就可以了。
LOJ#6055. 「from CommonAnts」一道数学题 加强版
LOJ讨论全局板块有题解
自述:
这是个前缀和的递推形式,可以将
∑
i
=
1
x
−
2
f
(
k
,
i
)
\sum_{i=1}^{x-2}f(k,i)
∑i=1x−2f(k,i) 用
f
(
k
,
x
−
1
)
−
(
x
−
1
)
k
f(k,x-1)-(x-1)^k
f(k,x−1)−(x−1)k 表示。
那么
f
(
k
,
x
)
=
2
f
(
k
,
x
−
1
)
+
x
k
−
(
x
−
1
)
k
f(k,x)=2f(k,x-1)+x^k-(x-1)^{k}
f(k,x)=2f(k,x−1)+xk−(x−1)k
至少有一个关于
x
x
x的
k
−
1
k-1
k−1次多项式可以满足这个递推关系,但是不一定会有同时满足
f
(
k
,
1
)
=
1
f(k,1)=1
f(k,1)=1 的
k
k
k次多项式。
构造
g
(
k
,
x
)
=
2
g
(
k
,
x
−
1
)
−
x
k
+
x
k
−
1
g(k,x)=2g(k,x-1)-x^k+x^{k-1}
g(k,x)=2g(k,x−1)−xk+xk−1
那么
f
(
k
,
x
)
+
g
(
k
,
x
)
=
2
(
f
(
k
,
x
−
1
)
+
g
(
k
,
x
−
1
)
)
f(k,x)+g(k,x)=2(f(k,x-1)+g(k,x-1))
f(k,x)+g(k,x)=2(f(k,x−1)+g(k,x−1)),所以
f
(
k
,
x
)
=
2
x
−
1
(
f
(
k
,
1
)
+
g
(
k
,
1
)
)
−
g
(
k
,
x
)
f(k,x)=2^{x-1}(f(k,1)+g(k,1))-g(k,x)
f(k,x)=2x−1(f(k,1)+g(k,1))−g(k,x)
那么我们只需要找到一个满足
g
g
g 的递推关系的
k
−
1
k-1
k−1 次多项式,并求出
g
(
k
,
1
)
g(k,1)
g(k,1) 和
g
(
k
,
x
)
g(k,x)
g(k,x)
可以设出
g
(
k
,
0
)
g(k,0)
g(k,0),然后由递推关系推出
g
(
k
,
1...
k
)
g(k,1...k)
g(k,1...k),此时可以插值求
g
(
k
,
k
)
g(k,k)
g(k,k) 建立
g
(
k
,
0
)
g(k,0)
g(k,0) 的等式从而求解。而LOJ的题解给出了这样一个恒等式:
∑
i
=
0
k
(
−
1
)
i
(
k
i
)
g
(
k
,
i
)
=
0
\sum_{i=0}^k(-1)^i\binom kig(k,i)=0
i=0∑k(−1)i(ik)g(k,i)=0
实际上,对任何
≤
k
−
1
\le k-1
≤k−1次的多项式
F
(
x
)
F(x)
F(x),都有
∑
i
=
0
k
(
−
1
)
i
(
k
i
)
F
(
i
)
=
0
\sum_{i=0}^{k}(-1)^i\binom kiF(i)=0
∑i=0k(−1)i(ik)F(i)=0,具体证明可以将
x
=
−
1
x=-1
x=−1 代入2020联合省选D1T2组合数问题中。
然后就解出了
g
(
k
,
0
)
g(k,0)
g(k,0),递推
g
(
k
,
1...
k
−
1
)
g(k,1...k-1)
g(k,1...k−1),然后拉格朗日插值求出
g
(
k
,
x
)
g(k,x)
g(k,x) 即可。
复杂度
O
(
k
)
O(k)
O(k)
LOJ#6609. 无意识的石子堆 加强版
n ∗ m n*m n∗m的棋盘,每行恰好放两个石子,每列最多放两个石子,求方案数。 n ≤ 2 ∗ 1 0 6 , m ≤ 1 0 18 n\le2*10^6,m\le10^{18} n≤2∗106,m≤1018
枚举放了两个石子的列的个数
k
k
k,记
S
k
S_k
Sk 为恰有
k
k
k列放了两个石子的方案数,那么有:
A
n
s
=
∑
k
=
0
n
(
m
k
)
(
m
−
k
2
n
−
2
k
)
S
k
Ans=\sum_{k=0}^n\binom mk\binom {m-k}{2n-2k}S_k
Ans=k=0∑n(km)(2n−2km−k)Sk
把行,列分别看做一排点,一个石子看做一条边,那么现在就是在二分图中求:左边有
n
n
n 个二度点,右边有
k
k
k 个二度点、
2
n
−
2
k
2n-2k
2n−2k 个一度点,连边的方案数。
把二度点拆成一度点,任意连边之后复原,可能会出现两个二度点连了重边的情况,枚举重边至少的条数进行容斥:
S
k
=
1
2
n
+
k
∑
i
=
0
k
(
−
1
)
i
(
n
i
)
(
k
i
)
i
!
2
i
∗
(
2
n
−
2
i
)
!
S_k=\frac 1{2^{n+k}}\sum_{i=0}^k(-1)^i\binom ni\binom kii!2^i*(2n-2i)!
Sk=2n+k1i=0∑k(−1)i(in)(ik)i!2i∗(2n−2i)!
卷积一下就可以了。
LOJ#6289. 花朵
n n n个点的数,每个点有权值 a i a_i ai,选出恰好 m m m 个不相邻的点,快乐度为权值之积,求所有方案的快乐度之和。
设
f
[
u
]
[
i
]
[
0
/
1
]
f[u][i][0/1]
f[u][i][0/1] 表示
u
u
u 子树内选
i
i
i 个点,
u
u
u 不选/选 的快乐度之和。
重链剖分,轻儿子分治NTT卷起来,重链按照轻儿子大小之和带权分治卷起来,要记录头尾有没有选。
分析一下复杂度:
卷轻儿子时,分治一个小log,总共log次作轻儿子,NTT一个log,复杂度
O
(
n
log
3
n
)
O(n\log^3n)
O(nlog3n),前两个
log
\log
log 比较小。分治卷积可以用堆也可以直接分治,不影响复杂度。
卷重链时,按照全局平衡二叉树的带权分治方法,总的深度是一个log的,NTT一个log,复杂度
O
(
n
log
2
n
)
O(n\log^2n)
O(nlog2n)
说起来蛮简单,实际细节想不清根本下不了手
说起来轻儿子卷起来转移到父亲的时候整体移位总复杂度是
O
(
n
log
n
)
O(n\log n)
O(nlogn)的
看完别人的代码(0.7h later)发现其实还是蛮简单的