考虑容斥,枚举哪些限制强制不满足,把n减去这些不满足限制的和,然后计算组合数. 注意到组合数有点难算,注意到可以把组合数看成一个
mm阶多项式,就可以把问题转换成对每一个
1\leq k\leq m1≤k≤m计算
kk次方的和. 如果
c=1c=1,可以数位dp,把每一位的贡献dp进去计算. 如果
c\neq 1c≠1,需要预先枚举有几个限制不满足,然后再数位dp. 注意到可以把随意选择的位的dp结果预处理好来进行加速. 时间复杂度
O(m^4)O(m4).
1002
我们知道,对于任意两个数
a,ba,b,我们有:
a~and~b=(a~or~b)-(a~xor~b)
我们枚举x=a~or~bx=a or b,y=a~xor~by=a xor b,显然要求的条件是x~and~y=yx and y=y
之后可以计算满足以上条件的(a,b)(a,b)有2^{bit(y)}2bit(y)个
于是可以将式子重写成:
C[k]=\sum_{x}\sum_{y}[x~and~y=y]*[x-y=k]*B[x]*A[y]*2^{bit(y)}C[k]=∑x∑y[x and y=y]∗[x−y=k]∗B[x]∗A[y]∗2bit(y)
C[k]=\sum_{x}\sum_{y}[x~and~y=y]*[x~xor~y=k]*B[x]*A[y]*2^{bit(y)}C[k]=∑x∑y[x and y=y]∗[x xor y=k]∗B[x]∗A[y]∗2bit(y)
C[k]=\sum_{x~xor~y=k}[x~and~y=y]B[x]*A[y]*2^{bit(y)}C[k]=∑x xor y=k[x and y=y]B[x]∗A[y]∗2bit(y)
C[k]=\sum_{x~xor~y=k}[bit(x)-bit(y)=bit(k)]B[x]*A[y]*2^{bit(y)}C[k]=∑x xor y=k[bit(x)−bit(y)=bit(k)]B[x]∗A[y]∗2bit(y)
用元素为多项式的FWT计算即可
时间复杂度:O(2^m*m^2)O(2m∗m2)
1003
我们只要求出对于一个数
xx左边最近的
kk个比他大的和右边最近
kk个比他大的,扫一下就可以知道有几个区间的
kk大值是
xx.
我们考虑从小到大枚举xx,每次维护一个链表,链表里只有>=x>=x的数,那么往左往右找只要暴力跳kk次,删除也是O(1)O(1)的。
时间复杂度:O(nk)O(nk)
1004
若
A_i~xor~A_j<A_j~xor~A_kAi xor Aj<Aj xor Ak,考虑
A_iAi和
A_kAk不同的位中最高的,根据这一位的值可以知道
A_jAj这一位的值必须是多少。
用一个字母树存下所有A_kAk,询问A_iAi时爬一下即可,顺便记录下中间有几个满足条件的A_jAj。
时间复杂度:O(n\log{A_i})O(nlogAi)
1005
把1看成整棵树的根. 问题相当于把
2\sim n2∼n每个点一个
[1, k][1,k]的标号. 然后根据最小斯坦纳树的定义,
(x, fa_x)(x,fax) 这条边的贡献是 x 子树内不同标号的个数目
dif_idifi. 那么显然有
dif_i\leq min(k, sz_i)difi≤min(k,szi),
sz_iszi表示子树大小. 可以通过构造让所有
dif_idifi都取到最大值. 所以答案就是
\sum_{x = 2}^{n}{w[x][fa_x] * min(sz_x, k)}∑x=2nw[x][fax]∗min(szx,k) 时间复杂度
O(n)O(n).
1006
问题相当于展开
f(x-\sum a_i)f(x−∑ai)。
我们可以把每一项用二项式定理展开,然后可以发现这是可以用FFTFFT优化的。
时间复杂度:O(n\log{n})O(nlogn)
1007
建一个 extra bit always1他的值永远是1. 如何判断
x_i = 1xi=1? 新建一个 extra bit is[i][1], 初值为0,来存结果, 构造gate : i always1 is[i][1]. 如何判断
x_i = 0xi=0? 新建一个 extra bit is[i][0],初值为1,来存结果, 构造gate : is[i][1] always1 is[i][0]. 构造一个Trie. 每个节点 t 新建一个extra bit act[t], 并且构造gate : act[fa[t]] is[dep[t]][dir] act[t] 其中 dir 表示方向,如果t是左儿子就是0,否则就是1. 这样对于一组输入,恰好有一片叶子的act是1,对每片答案为1的叶子构造gate: act[t] always1 output_bit. 可以通过设定output_bit的初值来减少对叶子的判断. gate和extra bit个数大约在
2^{m+1}+2^{m}2m+1+2m左右.
1008
注意到一个数字
xx必然会被唯一表示成
a^2\times ba2×b的形式.其中
|\mu(b)| = 1∣μ(b)∣=1。 所以这个式子会把
[1, n^k][1,nk]的每个整数恰好算一次. 所以答案就是
n^knk,快速幂即可. 时间复杂度
O(\log k)O(logk).
1009
注意到计算的是欧拉回路. 把BEST's THEOREM 稍加修改可以得到答案.
Trees \times deg[1]! \times \prod_{i = 2}^{m}{(deg[i]-1)!}\prod_{i = 1}^{m}\prod_{j = 1}^{m}{\frac{1}{D_{i, j}!}}Trees×deg[1]!×∏i=2m(deg[i]−1)!∏i=1m∏j=1mDi,j!1
TreesTrees表示1为根的生成树个数,用基尔霍夫矩阵计算就行了. 时间复杂度
O(m^3)O(m3).
1010
用
f[i][j]f[i][j]表示
p[1 : i]p[1:i]分成
jj段的最小代价. 显然可以写出一个
O(n^2k)O(n2k)的
dpdp. 考虑用cdq分治优化dp, 考虑用
f[l][j - 1] \cdots f[md][j - 1]f[l][j−1]⋯f[md][j−1] 来影响
f[md + 1][j] \cdots f[r][j]f[md+1][j]⋯f[r][j] 处理出
A_xAx表示
[x, md][x,md]的lca,
B_xBx表示
[md+1,x][md+1,x]的lca. 转移的时候计算lca(A[i],B[j])就行了. 考虑枚举每一个[md+1,r]的t.注意到转移分成两段,一段后缀满足lca是lca(B[t],p[md]),剩下的一段前缀lca是A[i], 前后缀的分界线可以单调移动得到. 然后分两段分别转移就好了,通过预处理前后缀最小值来
O(1)O(1)转移. 时间复杂度
O(nk\log n)O(nklogn)
1011
一个签到题,目的在于吐槽浙江的高温
统计有多少数<=35<=35即可。
1001
考虑容斥,枚举哪些限制强制不满足,把n减去这些不满足限制的和,然后计算组合数. 注意到组合数有点难算,注意到可以把组合数看成一个
mm阶多项式,就可以把问题转换成对每一个
1\leq k\leq m1≤k≤m计算
kk次方的和. 如果
c=1c=1,可以数位dp,把每一位的贡献dp进去计算. 如果
c\neq 1c≠1,需要预先枚举有几个限制不满足,然后再数位dp. 注意到可以把随意选择的位的dp结果预处理好来进行加速. 时间复杂度
O(m^4)O(m4).
1002
我们知道,对于任意两个数
a,ba,b,我们有:
a~and~b=(a~or~b)-(a~xor~b)
我们枚举x=a~or~bx=a or b,y=a~xor~by=a xor b,显然要求的条件是x~and~y=yx and y=y
之后可以计算满足以上条件的(a,b)(a,b)有2^{bit(y)}2bit(y)个
于是可以将式子重写成:
C[k]=\sum_{x}\sum_{y}[x~and~y=y]*[x-y=k]*B[x]*A[y]*2^{bit(y)}C[k]=∑x∑y[x and y=y]∗[x−y=k]∗B[x]∗A[y]∗2bit(y)
C[k]=\sum_{x}\sum_{y}[x~and~y=y]*[x~xor~y=k]*B[x]*A[y]*2^{bit(y)}C[k]=∑x∑y[x and y=y]∗[x xor y=k]∗B[x]∗A[y]∗2bit(y)
C[k]=\sum_{x~xor~y=k}[x~and~y=y]B[x]*A[y]*2^{bit(y)}C[k]=∑x xor y=k[x and y=y]B[x]∗A[y]∗2bit(y)
C[k]=\sum_{x~xor~y=k}[bit(x)-bit(y)=bit(k)]B[x]*A[y]*2^{bit(y)}C[k]=∑x xor y=k[bit(x)−bit(y)=bit(k)]B[x]∗A[y]∗2bit(y)
用元素为多项式的FWT计算即可
时间复杂度:O(2^m*m^2)O(2m∗m2)
1003
我们只要求出对于一个数
xx左边最近的
kk个比他大的和右边最近
kk个比他大的,扫一下就可以知道有几个区间的
kk大值是
xx.
我们考虑从小到大枚举xx,每次维护一个链表,链表里只有>=x>=x的数,那么往左往右找只要暴力跳kk次,删除也是O(1)O(1)的。
时间复杂度:O(nk)O(nk)
1004
若
A_i~xor~A_j<A_j~xor~A_kAi xor Aj<Aj xor Ak,考虑
A_iAi和
A_kAk不同的位中最高的,根据这一位的值可以知道
A_jAj这一位的值必须是多少。
用一个字母树存下所有A_kAk,询问A_iAi时爬一下即可,顺便记录下中间有几个满足条件的A_jAj。
时间复杂度:O(n\log{A_i})O(nlogAi)
1005
把1看成整棵树的根. 问题相当于把
2\sim n2∼n每个点一个
[1, k][1,k]的标号. 然后根据最小斯坦纳树的定义,
(x, fa_x)(x,fax) 这条边的贡献是 x 子树内不同标号的个数目
dif_idifi. 那么显然有
dif_i\leq min(k, sz_i)difi≤min(k,szi),
sz_iszi表示子树大小. 可以通过构造让所有
dif_idifi都取到最大值. 所以答案就是
\sum_{x = 2}^{n}{w[x][fa_x] * min(sz_x, k)}∑x=2nw[x][fax]∗min(szx,k) 时间复杂度
O(n)O(n).
1006
问题相当于展开
f(x-\sum a_i)f(x−∑ai)。
我们可以把每一项用二项式定理展开,然后可以发现这是可以用FFTFFT优化的。
时间复杂度:O(n\log{n})O(nlogn)
1007
建一个 extra bit always1他的值永远是1. 如何判断
x_i = 1xi=1? 新建一个 extra bit is[i][1], 初值为0,来存结果, 构造gate : i always1 is[i][1]. 如何判断
x_i = 0xi=0? 新建一个 extra bit is[i][0],初值为1,来存结果, 构造gate : is[i][1] always1 is[i][0]. 构造一个Trie. 每个节点 t 新建一个extra bit act[t], 并且构造gate : act[fa[t]] is[dep[t]][dir] act[t] 其中 dir 表示方向,如果t是左儿子就是0,否则就是1. 这样对于一组输入,恰好有一片叶子的act是1,对每片答案为1的叶子构造gate: act[t] always1 output_bit. 可以通过设定output_bit的初值来减少对叶子的判断. gate和extra bit个数大约在
2^{m+1}+2^{m}2m+1+2m左右.
1008
注意到一个数字
xx必然会被唯一表示成
a^2\times ba2×b的形式.其中
|\mu(b)| = 1∣μ(b)∣=1。 所以这个式子会把
[1, n^k][1,nk]的每个整数恰好算一次. 所以答案就是
n^knk,快速幂即可. 时间复杂度
O(\log k)O(logk).
1009
注意到计算的是欧拉回路. 把BEST's THEOREM 稍加修改可以得到答案.
Trees \times deg[1]! \times \prod_{i = 2}^{m}{(deg[i]-1)!}\prod_{i = 1}^{m}\prod_{j = 1}^{m}{\frac{1}{D_{i, j}!}}Trees×deg[1]!×∏i=2m(deg[i]−1)!∏i=1m∏j=1mDi,j!1
TreesTrees表示1为根的生成树个数,用基尔霍夫矩阵计算就行了. 时间复杂度
O(m^3)O(m3).
1010
用
f[i][j]f[i][j]表示
p[1 : i]p[1:i]分成
jj段的最小代价. 显然可以写出一个
O(n^2k)O(n2k)的
dpdp. 考虑用cdq分治优化dp, 考虑用
f[l][j - 1] \cdots f[md][j - 1]f[l][j−1]⋯f[md][j−1] 来影响
f[md + 1][j] \cdots f[r][j]f[md+1][j]⋯f[r][j] 处理出
A_xAx表示
[x, md][x,md]的lca,
B_xBx表示
[md+1,x][md+1,x]的lca. 转移的时候计算lca(A[i],B[j])就行了. 考虑枚举每一个[md+1,r]的t.注意到转移分成两段,一段后缀满足lca是lca(B[t],p[md]),剩下的一段前缀lca是A[i], 前后缀的分界线可以单调移动得到. 然后分两段分别转移就好了,通过预处理前后缀最小值来
O(1)O(1)转移. 时间复杂度
O(nk\log n)O(nklogn)
1011
一个签到题,目的在于吐槽浙江的高温
统计有多少数<=35<=35即可。