八月的做题记录因为是暑假所以鸽掉了。
离联赛真的不远了,要继续努力啊qwq…
2020.08.30
今天考试,修了20+次锅,修的我都没有心情做题了…
然后开始消极比赛…
明明08还是有那么多质量高的题目,为什么要选这些题…
结果考后补题的时候又发现了一堆没有修好的锅…
真没想到大家对待出题互测的态度就是这样,唉…
一道没有任何营养的本身很简单却要输入大模拟+输出方案的dp题。
首先模拟求得 { b i } \{b_i\} {bi}序列,然后有个显然的dp。
定义 f i , j f_{i,j} fi,j表示现在处理好 a a a序列的前 i i i个, b b b序列的前 j j j个,最小的答案的 p a i r pair pair为多少(即被替换的数的数量和操作次数)。
显然有:
f i , j = min { f i − 1 , j − 1 ( a i = b i ) min 0 ≤ i ′ < i , 0 ≤ j ′ < j { f i ′ , j ′ + ( i − i ′ , 1 ) } f_{i,j}=\min \begin{cases} f_{i-1,j-1} (a_i=b_i)\\ \min_{0\leq i'fi,j=min{fi−1,j−1(ai=bi)min0≤i′<i,0≤j′<j{fi′,j′+(i−i′,1)}
这是 O ( n 4 ) O(n^4) O(n4)的。
上面这个式子我们只需要维护一下前缀最小值就可以做到 O ( n 2 ) O(n^2) O(n2)。
如果知道莫比乌斯反演怎么容斥的话这题就是板子题…
说实话我现在才知道我之前搞的某些容斥是莫比乌斯反演…
考虑反演,我们枚举 d d d,我们要计算选择了若干个数后最终这些数的gcd不被 d d d整除。
我们可以把所有被 d d d整除的 a i a_i ai提出来,然后计算从中挑出 k k k个的概率。
设 f ( d , k ) f(d,k) f(d,k)即从 d d d整除的 a i a_i ai连续选 k k k个的概率。
显然 f ( d , k ) = c n t d k ‾ n k ‾ f(d,k)=\frac{cnt_d^{\underline{k}}}{n^{\underline{k}}} f(d,k)=nkcntdk
那么定义 g i g_i gi表示至多挑 i i i个数后所有数的 g c d gcd gcd变为 1 1 1个概率。
那么有 g k + = μ ( k ) × f ( d , k ) g_k+=μ(k)\times f(d,k) gk+=μ(k)×f(d,k)。
最终答案是 ∑ i m o d 2 = 0 n + 1 g i − g i − 1 \sum^{n+1}_{i\bmod2=0}g_{i}-g_{i-1} ∑imod2=0n+1gi−gi−1
注意边界 g n + 1 = 1 g_{n+1}=1 gn+1=1。
这题还好吧,至少有教育意义:)
tip:有一个非常神奇的错误:
printf("%.5f",(x&1));
在Linux会输出一堆奇奇怪怪的小数,必须printf("%.5f",(x&1)?1.0:0.0);
。
一道没有任何营养的大暴力题。
O ( σ ( n ) + n log n ) O(σ(n)+n\log n) O(σ(n)+nlogn)能过,没了。
明显可以分块套一个链表/队列即可。
看到有用块状链表的…感觉用到这题上面不是很好…
其实用队列维护比较麻烦,不过deque有erase
功能…
套路题…
考虑设计两个做法,然后它们拼起来。
考虑到单颜色边数大于 m \sqrt{m} m 的颜色最多 m \sqrt{m} m个。
因此对于单颜色边数大于 m \sqrt{m} m 的颜色我们直接分别对每个颜色暴力用并查集维护即可,复杂度 O ( n m α ( n ) ) O(n\sqrt{m}α(n)) O(nmα(n))。
单颜色边数小于 m \sqrt{m} m 的比较难想。注意到这种情况下涉及到的图中的点数最大为 O ( m ) O(\sqrt{m}) O(m),那么我们可以直接把涉及到的点的两两之间的答案直接求出来存在 map
中,这样做是 联通块大小的平方的复杂度。
这样做看似会达到 O ( m 2 ) O(m^2) O(m2)的复杂度,但是可以证明对于 m m m 的一个划分 a i a_i ai ,即:
{ ∑ i = 1 k a i = m a i < m \begin{cases} \sum^k_{i=1}a_i=m\\ a_i<\sqrt{m}\\ \end{cases} {∑i=1kai=mai<m
一定满足 ∑ i = 1 k a i 2 < m m \sum^k_{i=1}a_i^2
因此这个算法的复杂度实际上是 O ( m m α ( n ) ) O(m\sqrt{m}α(n)) O(mmα(n))。
总复杂度: O ( m m α ( n ) + n m α ( n ) ) O(m\sqrt{m}α(n)+n\sqrt{m}α(n)) O(mmα(n)+nmα(n))。
但是,有一个本质差不多的暴力也能够直接通过这道题目,详见大佬博客。
2020.08.31-2020.09.06
又开学了…
由于一些原因,总结第二天写的…
n n n为奇数的构造方案:
以下是简短的代码:
void print(int x){
printf("213");
for(int i=1;i<x;i++)printf("42");
printf("4");
for(int i=1;i<=x;i++)printf("53");
printf("5");
for(int i=1;i<=x;i++)printf("64");
printf("6");
for(int i=1;i<=x;i++)printf("15");
printf("1");
for(int i=1;i<=x;i++)printf("26");
printf("2");
for(int i=1;i<=x;i++)printf("31");
}
void solve(int n){
if(n%2==0)printf("643216");
for(int i=(n%2==0)?2:1;i<n;i+=2)print(i);
}
首先对于树的情况,考虑我们现在先随便排顺序,再考虑是否合法。我们可以把条件转化为任意一颗子树的根都必须先比它的儿子出现。
那么可以得到树的答案就是 n ! ∏ i = 1 n 1 s i z i n!\prod^n_{i=1}\frac{1}{siz_i} n!∏i=1nsizi1。
对于仙人掌的情况,我们对于每个不在环上的点还是乘上后面那个系数,对于环我们单独讨论乘上什么系数。
这里一定要注意到原题有 d u i ≠ d v i d_{u_i}≠d_{v_i} dui=dvi这个条件,这意味着这是一个偶环仙人掌。
那么我们可以先建出原图的BFS生成树,这样我们的环的 d d d值一定会随深度的增大而增大。这是整道题目最核心的思想。
考虑对环上的点进行dp,注意到在BFS生成树上的环的横叉边一定位于这个环的底部,并且把环的底部的一个点删去之后两边均匀的分成了两个部分且都必须遵守从下往上取的顺序关系。
因此我们考虑一个 O ( n 2 ) O(n^2) O(n2)的dp,定义 f i , j f_{i,j} fi,j表示当前环左边已经从下往上取了 i i i个数,右边已经从下往上取了 j j j个数的限制系数之和。
那么有 f i , j = ( f i − 1 , j + f i , j − 1 ) 1 s u m i , j f_{i,j}=(f_{i-1,j}+f_{i,j-1})\frac{1}{sum_{i,j}} fi,j=(fi−1,j+fi,j−1)sumi,j1。
这里 s u m i , j sum_{i,j} sumi,j表示已经在环上取了的点和其延伸出去的所有点的大小之和,这个可以比较方便的处理出来。
复杂度: O ( n 2 ) O(n^2) O(n2),由于环的大小比较小因此常数很小。
tip:多测太恶心人了…
为什么我现在从来没有存图的head[x]
的数组必须清零的印象…
以后多组测试数据最好都清零或者把两个样例多测几遍…
已知 n n n 个点 m m m 条边的无向连通图,对于三元组 ( u , v , r ) (u,v,r) (u,v,r) 表示 u , v u,v u,v 之间连接一阻值为 r r r 的电阻
给定 S , T S,T S,T 求出 S , T S,T S,T 间的等效电阻
就是个物理题…
假设 S S S 流入 1 A 1A 1A 电流,设每个点 i i i 的电势为 φ i φ_i φi。
这样我们最终的答案就是 φ S φ_{S} φS 。
根据基尔霍夫电流定律,对于每个点 u u u均满足:
∑ v φ u − φ v R u , v = [ u = S ] − [ u = T ] \sum_{v}\frac{φ_u-φ_v}{R_{u,v}}=[u=S]-[u=T] v∑Ru,vφu−φv=[u=S]−[u=T]
但是光靠这个是解不出来了。
我们还需要 φ T = 0 φ_{T}=0 φT=0 就可以了。
首先考虑一个 O ( n 4 ) O(n^4) O(n4) 的动态规划:
定义 f u , v , k f_{u,v,k} fu,v,k为当前 ∑ i = 1 k a i = u , ∑ i = 1 k b i = v \sum^k_{i=1}a_i=u,\sum^k_{i=1}b_i=v ∑i=1kai=u,∑i=1kbi=v,可以考虑用前缀和的套路进行转移。
这种二维转移很容易让我们想起走网格图之类的经典模型,但是 ∏ i = 1 k min ( a , b i ) \prod^k_{i=1}\min(a_,b_i) ∏i=1kmin(a,bi)这个代价很难以转化成组合意义。
这里用到的一个很关键的技巧:对于走网格图一类经典模型,我们同样可以把它写成生成函数的形式。
若我们求的是划分的方案数,那么生成函数是:
( x + x 2 + ⋯ + x n ) k ( y + y 2 + ⋯ + x m ) k (x+x^2+\dots +x^n)^k(y+y^2+\dots +x^m)^k (x+x2+⋯+xn)k(y+y2+⋯+xm)k
我们需要的即是第 x n y m x^ny^m xnym项的系数。
那么对于本题,我们可以把代价看成在这个基础上选择若干个划分在同一块中的 x x x和 y y y合并起来的方案数,即:
( x + x 2 + ⋯ + x u ) k ( y + y 2 + ⋯ + x v ) k ( 1 + x y + ⋯ + ( x y ) n − k ) k (x+x^2+\dots +x^u)^k(y+y^2+\dots +x^v)^k(1+xy+\dots +(xy)^{n-k})^k (x+x2+⋯+xu)k(y+y2+⋯+xv)k(1+xy+⋯+(xy)n−k)k
我们可以直接组合数计算出 x n y m x^ny^m xnym的系数。
复杂度: O ( T n ) O(Tn) O(Tn)。
一看到这种模型就知道是什么无脑大模拟之类的东西…
事实上对于环我们单独考虑环上差分,树的部分直接树上差分即可。
实现上可以通过桶之类的东西做到 O ( n ) O(n) O(n),但是直接倍增 O ( n log n ) O(n\log n) O(nlogn) 也没有什么区别。
tip:一定要注意空间上的开销问题。
考虑交换论证得到原序列可以按照 a i + b i a_i+b_i ai+bi 的顺序排列一定最优。
但是我们并不清楚当前矮人是否会被安排逃出井中。
对于 O ( n 2 ) O(n^2) O(n2)的数据我们考虑通过dp来解决。
我们考虑一开始先把所有人按顺序堆在一起,然后从上到下让每个人依次逃出洞穴,如果发现有人逃不出这个洞时,我们就拿一个已经逃出洞且 a i a_i ai最大的一个人拉回去,让这个人逃出洞中,可以发现这样一定可行且答案一定不会变得更劣,因此会得到最优解。
实现的话用一个优先队列即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)。
注意到我们对于一个形如 a 1 × a 2 ⋯ × a k 1 + b 1 × b 2 ⋯ × b k 2 + … a_1\times a_2\dots \times a_{k_1}+b_1\times b_2\dots \times b_{k_2}+\dots a1×a2⋯×ak1+b1×b2⋯×bk2+…这样的序列,我们总能找到恰好一个相反的序列 a 1 × a 2 ⋯ × a k 1 − b 1 × b 2 ⋯ × b k 2 − … a_1\times a_2\dots \times a_{k_1}-b_1\times b_2\dots \times b_{k_2}-\dots a1×a2⋯×ak1−b1×b2⋯×bk2−…使得结果抵消为 a 1 × a 2 ⋯ × a k 1 a_1\times a_2\dots \times a_{k_1} a1×a2⋯×ak1。
那么我们就可以直接维护这个序列的前缀积 S i S_i Si,答案就是 S n + ∑ i = 1 n − 1 S i × 2 × 3 n − i − 1 S_n+\sum^{n-1}_{i=1}S_i\times 2\times 3^{n-i-1} Sn+∑i=1n−1Si×2×3n−i−1。
考虑用线段树维护当前节点内的前缀积 p r o d x prod_x prodx,当前节点内的前缀积的和 s u m x sum_x sumx。
那么有:
p r o d x = p r o d l c × p r o d r c s u m x = s u m l c + p r o d l c × s u m r c prod_x=prod_{lc}\times prod_{rc}\\ sum_x=sum_{lc}+prod_{lc}\times sum_{rc}\\ prodx=prodlc×prodrcsumx=sumlc+prodlc×sumrc
写一个支持单点修改的线段树即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
我们可以把原问题等价为两个人在图上依次按顺序遍历若干个点 d i d_i di,其中一个人可以在任意时刻瞬移到另一个人当前所在的位置,求最小遍历路径长度。
定义 f i , a , b f_{i,a,b} fi,a,b表示完成遍历了前 i i i个点,现在第一个人在点 a a a,第二个人在点 b b b。
每次我们从 i − 1 i-1 i−1转移至 i i i,那么其中一个人需要走到 d i d_i di,我们设其为 c c c。
然后分两种情况转移即可:
转移的时候我们 a , b a,b a,b 之中只需要枚举一个数,另外一个显然是 d i − 1 d_{i-1} di−1 ,转移过程中我们需要枚举 d d d ,因此总的复杂度是 O ( n 2 k ) O(n^2k) O(n2k)。
显然加的边的 p a i r pair pair 时边权相同。
考虑dfs处理 d x d_x dx表示 x x x到根的边的异或和。
那么一条 ( u , v ) (u,v) (u,v)的边权就是 d u ⊕ d v d_u⊕d_v du⊕dv,然后我们求一颗最小生成树即可。
然后就是最小异或生成树模板题[CF888G Xor-MST]。
复杂度: O ( n log 2 a i ) O(n\log^2 a_i) O(nlog2ai)。
tip: 注意复习以前做过的经典模型。
莫比乌斯反演练习:
P3935 Calculating
CF439E Devu and Birthday Celebration
CF547C Mike and Foam
CF839D Winter is here
P2257 YY的GCD
P2522 [HAOI2011]Problem b
P3172 [CQOI2015]选数
P3327 [SDOI2015]约数个数和
P3455 [POI2007]ZAP-Queries
P4450 双亲数
P6055 [RC-02] GCD
P1829 [国家集训队]Crash的数字表格 / JZPTAB
P3312 [SDOI2014]数表
其实算是很套路的…
一天AC了十几道题目看似高效实际上代码长得都差不多…(突然想到莫队)
早上模拟赛又自闭了。
由于某些原因隐藏了题目来源。
题目质量比较一般…
由于 n n n 是偶数,因此将所有 b i b_i bi 异或起来就是所有 a i a_i ai 的异或和。
然后我们依次求 a i a_i ai 即可。
{ f i = f i − 1 ( s i = s i − 1 ) f i = f i − 1 + f i − 2 ( s i ≠ s i − 1 ) \begin{cases} f_i=f_{i-1}(s_i=s_{i-1})\\ f_i=f_{i-1}+f_{i-2}(s_i≠s_{i-1})\\ \end{cases} {fi=fi−1(si=si−1)fi=fi−1+fi−2(si=si−1)
tip:注意 f 1 f_1 f1 需要特判,考试的时候我没特判导致访问到了 f − 1 f_{-1} f−1 ,还好由于某些原理(比如你
int a[100],x;
,那么a[-1]
就是x
)这个指针的位置上的值一定是0
,就没错…以后一定要注意这个问题。
容易发现横纵方向互相独立,我们可以单独考虑再乘起来。
这样问题就变成了一个线段覆盖问题。
虽然总共的选择方案是 2 n 2^n 2n,但是发现对于一个中间没有任何线段端点的一段线段,它有且仅会对应一个选择方案。因此合法的选择方案最多是 2 n 2n 2n 的。
直接dfs+剪枝即可得到一个 O ( n 2 ) O(n^2) O(n2)的做法,对于相同选择方案的一段我们采用hash+map来合并。
但是注意到我们仅会在该线段的端点修改选择方案的状态,因此我们直接从左到右递推即可做到 O ( n log n ) O(n\log n) O(nlogn)。
tip:为了避免卡常,最好使用 u n o r d e r e d _ m a p unordered\_map unordered_map。
这种题目显然考虑分治,考虑计算在区间 [ l , r ] [l,r] [l,r] 跨过分治中心的的合法区间数,注意到最终求到的数一定最多比在当前区间的最大数 m x mx mx大 log n \log n logn。这样我们就可以把分治中心设为 m x mx mx暴力枚举最终答案计算区间数了。
至于计算方案数的细节…特别多…我不想提…反正注意计算时暴力枚举长度小的一边计算是 O ( n log n ) O(n\log n) O(nlogn)的即可。
如果我们用map复杂度是 O ( n log 3 n ) O(n\log^3 n) O(nlog3n),但是使用 u n o r d e r e d _ m a p unordered\_map unordered_map就是 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)。
tip:考试的时候 a i ≤ 30 a_i\leq 30 ai≤30的 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)二分查找,其余的 O ( n 2 ) O(n^2) O(n2)暴力+大力剪枝直接AC可还行…
当然这种写起来恶心死人的题目还是乱搞比较好:)
找到一个有趣的质数: 1145146987 1145146987 1145146987,分享一下qwq。
2020.09.07-2020.09.13
读错题了…然后就爆炸+垫底了…
其实结论就是直接暴力循环比较即可。
但是明显用hash一段一段的判断相等比暴力匹配要稳的多。
复杂度: O ( n + m ) O(n+m) O(n+m)
看成异或和,然后成功自闭了。
如果是或和的话我们直接在笛卡尔树时维护一个 O ( log a i ) O(\log a_i) O(logai) 的tag即可。
时限不好的会由于题目要求32MB
会爆栈空间,当然我没有管这个问题。
复杂度: O ( n log a i ) O(n\log a_i) O(nlogai)
结论是这个后缀排序等价于 { c i } \{c_i\} {ci} 的后缀排序。
其中 { c i } \{c_i\} {ci} 为 min j , j > i , s i = s j { j − i } \min_{j,j>i,s_i=s_j}\{j-i\} minj,j>i,si=sj{j−i}。
其实我们也可以不用这个结论利用后缀数组或SAM的一些函数直接进行排序。
复杂度: O ( n log n ) O(n\log n) O(nlogn)。
感觉是CQOI里面出的最好的题目之一(?)。
挺简单一道题,然而我做了1h…
真·NOIP模拟赛。
直接莫比乌斯反演可以得到一个 O ( n log n ) O(n\log n) O(nlogn) 的做法,但是无法通过 n ≤ 5 × 1 0 7 n\leq 5\times 10^7 n≤5×107 的数据。
注意到原式还可以表达为:
∑ d = 1 n ( ∑ j = 1 ⌊ n d ⌋ σ ( j d ) ) 2 \sum^n_{d=1}(\sum^{\lfloor{\frac{n}{d}}\rfloor}_{j=1}σ(jd))^2 d=1∑n(j=1∑⌊dn⌋σ(jd))2
我们只需要用Dirichlet 后缀和即可 O ( n log log n ) O(n\log \log n) O(nloglogn) 预处理 ∑ j = 1 ⌊ n d ⌋ σ ( j d ) \sum^{\lfloor{\frac{n}{d}}\rfloor}_{j=1}σ(jd) ∑j=1⌊dn⌋σ(jd),然后 O ( n ) O(n) O(n) 计算即可。
发现无论怎么选加上一个直径一定不会使答案变劣,因此我们考虑首先加入直径,接下来的 B B B 集合的权值一定会递减, A A A 集合的权值一定会递增。
根据经典结论,我们每次加入一个点,离它最远的点一定包含直径端点中的一个。
因此我们只需要用剩下点的按距离从大到小排序依次加入,取最大权值即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
首先容易发现所有当前拥有卡片的状态可以 O ( 4 n ) O(4^n) O(4n) 来表示。
那么定义 d p S , i dp_{S,i} dpS,i 表示当前拥有卡片状态为 S S S ,现在某轮抽卡已经进行了 i i i 次的期望步数。
那么容易发现这个转移会呈现出若干个大小为 m m m 的不相交的环,因此我们对每个环单独解出它的值即可。
具体来说我们可以把每个 d p S , i dp_{S,i} dpS,i 写成 p i × d p S , i − 1 + q i p_i\times dp_{S,i-1}+q_i pi×dpS,i−1+qi,那么最终我们可以吧每个式子都写成 d p S , i = x i d p S , 0 + y i dp_{S,i}=x_idp_{S,0}+y_i dpS,i=xidpS,0+yi 的形式。
而我们可以通过 d p S , 0 dp_{S,0} dpS,0 自己和自己的关系解出 d p S , 0 dp_{S,0} dpS,0 ,然后我们再依次递推即可。
复杂度: O ( 4 n n m ) O(4^nnm) O(4nnm)。
其实本题是一个 min-max 反演的经典模型(而且那题也有这两种做法…)。
我们可以根据 min-max 反演把本题转化为:
E [ max ( S ) ] = ∑ T ⊆ S ( − 1 ) ∣ T ∣ + 1 E [ min ( T ) ] E[\max(S)]=\sum_{T⊆S}(-1)^{|T|+1}E[\min(T)] E[max(S)]=T⊆S∑(−1)∣T∣+1E[min(T)]
那么我们只需要求每一个物品子集中最先被选中的期望次数为多少。
容易计算出我们一轮都不会选择到任何属于该集合中的数的概率为 P = ( 1 − ∑ i ∈ T p i ) m − 1 × ( 1 − ∑ i ∈ T q i ) P=(1-\sum_{i\in T}p_i)^{m-1}\times (1-\sum_{i\in T} q_i) P=(1−∑i∈Tpi)m−1×(1−∑i∈Tqi),那么易得:
E [ min ( T ) ] = 1 + P × E [ min ( T ) ] E [ min ( T ) ] = 1 1 − P E[\min(T)]=1+P\times E[\min(T)]\\ E[\min(T)]=\frac{1}{1-P}\\ E[min(T)]=1+P×E[min(T)]E[min(T)]=1−P1
然后我们用 dfs 枚举状态计算即可。
复杂度: O ( 4 n log m ) O(4^n\log m) O(4nlogm)。
这怕是整场考试最大的一个败笔,2^n暴力直接70,正解无脑线段树优化建图。
说白了就是个码农题…
显然我们可以用 2-SAT 来判断这个问题,但是边数最多是 O ( m 2 ) O(m^2) O(m2) 级别的。
显然我们接下来考虑线段树优化建图,我们正着和倒着建两颗线段树,我们在叶子连上要被限制的点(具体来说我们只需要两个端点连到叶子上即可),对于区间的限制 [ l i , r i ] [l_i,r_i] [li,ri]我们连到线段树上的节点即可。
但是这样明显有一个问题,就是它可以自己向自己连边。在 2-SAT 是一个很难处理的问题。
为了防止这种情况,我们现在只连 [ l i + 1 , r i − 1 ] [l_i+1,r_i-1] [li+1,ri−1]的区间限制,那么区间端点恰好为 l i l_i li 或 r i r_i ri 的区间不会被限制,因此我们单独把这些区间提出来做一个经典的前缀&后缀限制即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)。(常数确实大…)
在补前几天的锅qwq…
怎么感觉CF的难度评分变水了…
贪心即可。
这不是经典题目吗…连ST表都不用…
看完题目想到tire树,但是要区间查询因此我们把它想成一颗线段树。
对于左右儿子交换的情况我们只需要用一个数组记录一下每次往那边走即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)。
以为自己已经会莫比乌斯反演了…结果是假相。
求: ∑ i = 1 n ∑ j = 1 n max ( i , j ) ⋅ σ ( i ⋅ j ) ( m o d 1 0 9 + 7 ) \sum^n_{i=1}\sum^n_{j=1}\max(i,j)·σ(i·j)\ \ \ (\bmod\ 10^9+7) i=1∑nj=1∑nmax(i,j)⋅σ(i⋅j) (mod 109+7)
T ≤ 5 × 1 0 4 , n ≤ 1 0 6 T\leq 5\times 10^4,n\leq 10^6 T≤5×104,n≤106。
首先可以研究 σ 0 ( i ⋅ j ) = ∑ x ∣ i ∑ y ∣ j [ g c d ( x , y ) = 1 ] σ_0(i·j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1] σ0(i⋅j)=∑x∣i∑y∣j[gcd(x,y)=1]的结论原理推出:
σ ( i ⋅ j ) = ∑ x ∣ i ∑ y ∣ j i x ⋅ y [ g c d ( x , y ) = 1 ] σ(i·j)=\sum_{x|i}\sum_{y|j}\frac{i}{x}·y[gcd(x,y)=1] σ(i⋅j)=x∣i∑y∣j∑xi⋅y[gcd(x,y)=1]
注意到 max ( i , j ) \max(i,j) max(i,j)不是很好弄,我们先只考虑 i < j i
得到:
∑ i = 1 n ∑ j = i + 1 n i ⋅ j ∑ x ∣ i ∑ y ∣ j y x [ g c d ( x , y ) = 1 ] \sum^n_{i=1}\sum^n_{j=i+1}i·j\sum_{x|i}\sum_{y|j}\frac{y}{x}[gcd(x,y)=1]\\ i=1∑nj=i+1∑ni⋅jx∣i∑y∣j∑xy[gcd(x,y)=1]
考虑对 [ g c d ( x , y ) = 1 ] [gcd(x,y)=1] [gcd(x,y)=1]莫反:
∑ i = 1 n ∑ j = i + 1 n i ⋅ j ∑ d μ ( d ) ∑ d ∣ x , x ∣ i ∑ d ∣ y , y ∣ j y d x d \sum^n_{i=1}\sum^n_{j=i+1}i·j\sum_{d}μ(d)\sum_{d|x,x|i}\sum_{d|y,y|j}\frac{yd}{xd}\\ i=1∑nj=i+1∑ni⋅jd∑μ(d)d∣x,x∣i∑d∣y,y∣j∑xdyd
注意到 i , j i,j i,j要满足 d ∣ i , d ∣ j d|i,d|j d∣i,d∣j,因此我们可以把 d d d 提到外面来。
∑ d μ ( d ) d 2 ∑ i = 1 ⌊ n d ⌋ ∑ j = i + 1 ⌊ n d ⌋ i ⋅ j ∑ x ∣ i ∑ y ∣ j y x ∑ d μ ( d ) d 2 ∑ i = 1 ⌊ n d ⌋ ∑ j = i + 1 ⌊ n d ⌋ j ( ∑ x ∣ i i x ) ( ∑ y ∣ j y ) ∑ d μ ( d ) d 2 ∑ i = 1 ⌊ n d ⌋ ∑ j = i + 1 ⌊ n d ⌋ j ⋅ σ ( i ) ⋅ σ ( j ) ∑ d μ ( d ) d 2 ∑ j = 1 ⌊ n d ⌋ j ⋅ σ ( j ) ( ∑ i = 1 j − 1 σ ( i ) ) \sum_{d}μ(d)d^2\sum^{\lfloor \frac{n}{d} \rfloor}_{i=1}\sum^{\lfloor \frac{n}{d} \rfloor}_{j=i+1}i·j\sum_{x|i}\sum_{y|j}\frac{y}{x}\\ \sum_{d}μ(d)d^2\sum^{\lfloor \frac{n}{d} \rfloor}_{i=1}\sum^{\lfloor \frac{n}{d} \rfloor}_{j=i+1}j\bigg ( \sum_{x|i}\frac{i}{x}\bigg )\bigg ( \sum_{y|j}y\bigg ) \\ \sum_{d}μ(d)d^2\sum^{\lfloor \frac{n}{d} \rfloor}_{i=1}\sum^{\lfloor \frac{n}{d} \rfloor}_{j=i+1}j·σ(i)·σ(j)\\ \sum_{d}μ(d)d^2\sum^{\lfloor \frac{n}{d} \rfloor}_{j=1}j·σ(j)\bigg ( \sum^{j-1}_{i=1}σ(i)\bigg )\\ d∑μ(d)d2i=1∑⌊dn⌋j=i+1∑⌊dn⌋i⋅jx∣i∑y∣j∑xyd∑μ(d)d2i=1∑⌊dn⌋j=i+1∑⌊dn⌋j(x∣i∑xi)(y∣j∑y)d∑μ(d)d2i=1∑⌊dn⌋j=i+1∑⌊dn⌋j⋅σ(i)⋅σ(j)d∑μ(d)d2j=1∑⌊dn⌋j⋅σ(j)(i=1∑j−1σ(i))
令 S ( n ) = ∑ i = 1 n σ ( i ) S(n)=\sum^{n}_{i=1}σ(i) S(n)=∑i=1nσ(i)。
那么有:
∑ d μ ( d ) d 2 ∑ j = 1 ⌊ n d ⌋ j ⋅ σ ( j ) ⋅ S ( j − 1 ) \sum_{d}μ(d)d^2\sum^{\lfloor \frac{n}{d} \rfloor}_{j=1}j·σ(j)·S(j-1)\\ d∑μ(d)d2j=1∑⌊dn⌋j⋅σ(j)⋅S(j−1)
我们再取消 i < j i
∑ d μ ( d ) d 2 ∑ j = 1 ⌊ n d ⌋ j ⋅ σ ( j ) ⋅ ( S ( j ) + S ( j − 1 ) ) \sum_{d}μ(d)d^2\sum^{\lfloor \frac{n}{d} \rfloor}_{j=1}j·σ(j)·(S(j)+S(j-1))\\ d∑μ(d)d2j=1∑⌊dn⌋j⋅σ(j)⋅(S(j)+S(j−1))
显然我们可以使用数论分块来解决这个问题,但是因为常数太大 O ( T n ) O(T\sqrt{n}) O(Tn) 过不去…
考虑离线预处理这个式子,令 G ( j ) = j ⋅ σ ( j ) ⋅ ( S ( j ) + S ( j − 1 ) ) G(j)=j·σ(j)·(S(j)+S(j-1)) G(j)=j⋅σ(j)⋅(S(j)+S(j−1)),然后我们交换式子:
∑ j = 1 G ( j ) ∑ d , j d ≤ n μ ( d ) d 2 \sum_{j=1}G(j)\sum_{d,jd\leq n}μ(d)d^2\\ j=1∑G(j)d,jd≤n∑μ(d)d2
这个就可以 O ( n log n ) O(n\log n) O(nlogn) 预处理了…
随便反演一下…就没了…
其实是一个结论题…
接下来一堆引理:
引理1: g c d ( f n − 1 , f n ) = 1 gcd(f_{n-1},f_{n})=1 gcd(fn−1,fn)=1。
证明: g c d ( f n − 1 , f n ) = g c d ( f n − 1 , f n − 1 + f n − 2 ) = g c d ( f n − 2 , f n − 1 ) = . . . = g c d ( f 1 , f 2 ) = 1 gcd(f_{n-1},f_{n})=gcd(f_{n-1},f_{n-1}+f_{n-2})=gcd(f_{n-2},f_{n-1})=...=gcd(f_1,f_2)=1 gcd(fn−1,fn)=gcd(fn−1,fn−1+fn−2)=gcd(fn−2,fn−1)=...=gcd(f1,f2)=1引理2: g c d ( f a , f b ) = f g c d ( a , b ) gcd(f_a,f_b)=f_{gcd(a,b)} gcd(fa,fb)=fgcd(a,b)。
证明:考虑转化为证明 g c d ( f a , f b ) = g c d ( f a + b , f b ) gcd(f_a,f_b)=gcd(f_{a+b},f_b) gcd(fa,fb)=gcd(fa+b,fb)即可利用辗转相除的性质进行证明。
根据引理1可得:
g c d ( f a + b , f b ) = g c d ( f a − 1 f b + f a f b + 1 , f b ) = g c d ( f a f b + 1 , f b ) = g c d ( f a , f b ) gcd(f_{a+b},f_b)=gcd(f_{a−1}f_b+f_af_{b+1},f_b)=gcd(f_af_{b+1},f_b)=gcd(f_a,f_b) gcd(fa+b,fb)=gcd(fa−1fb+fafb+1,fb)=gcd(fafb+1,fb)=gcd(fa,fb)引理3: l c m { S } = ∏ T ≠ ∅ , T ⊆ S gcd { T } ( − 1 ) ∣ T ∣ + 1 lcm\{S\}=\prod_{T≠∅,T⊆S}\gcd\{T\}^{(-1)^{|T|+1}} lcm{S}=∏T=∅,T⊆Sgcd{T}(−1)∣T∣+1。
简单证明:考虑对于每一个质因子 p i p_i pi , l c m lcm lcm 是取集合中次数最高的幂, g c d gcd gcd 是取集合中次数最低的幂,这显然符合 m i n − m a x min-max min−max 容斥的条件,那么我们再把每个质因子的情况和在一起即为上式。
那么对于本题而言,利用上面的引理,我们需要求的就是:
l c m { S } = ∏ T ≠ ∅ , T ⊆ S f gcd { T } ( − 1 ) ∣ T ∣ + 1 lcm\{S\}=\prod_{T≠∅,T⊆S}f_{\gcd\{T\}}^{(-1)^{|T|+1}} lcm{S}=T=∅,T⊆S∏fgcd{T}(−1)∣T∣+1
考虑计算贡献,即为:
l c m { S } = ∏ d f d ∑ T ≠ ∅ , T ⊆ S [ gcd { T } = d ] ( − 1 ) ∣ T ∣ + 1 lcm\{S\}=\prod_{d}f_{d}^{\sum_{T≠∅,T⊆S}[\gcd\{T\}=d](-1)^{|T|+1}} lcm{S}=d∏fd∑T=∅,T⊆S[gcd{T}=d](−1)∣T∣+1
令 a d = ∑ T ≠ ∅ , T ⊆ S [ gcd { T } = d ] ( − 1 ) ∣ T ∣ + 1 a_d=\sum_{T≠∅,T⊆S}[\gcd\{T\}=d](-1)^{|T|+1} ad=∑T=∅,T⊆S[gcd{T}=d](−1)∣T∣+1 考虑对其莫比乌斯反演,那么我们再定义 b d = ∑ T ≠ ∅ , T ⊆ S [ d ∣ gcd { T } ] ( − 1 ) ∣ T ∣ + 1 b_d=\sum_{T≠∅,T⊆S}[d|\gcd\{T\}](-1)^{|T|+1} bd=∑T=∅,T⊆S[d∣gcd{T}](−1)∣T∣+1,我们只需要求出 b d b_d bd 即可通过反演求出 a d = ∑ d ∣ p μ ( p d ) b p a_d=\sum_{d|p}μ(\frac{p}{d})b_p ad=∑d∣pμ(dp)bp 。
考虑对于 b d b_d bd 可以选择的数的个数为 g d = ∑ d ∣ p c n t p g_d=\sum_{d|p}cnt_p gd=∑d∣pcntp。
那么产生 -1
( ∣ T ∣ |T| ∣T∣为偶数)的贡献的会有 2 g d − 1 − 1 2^{g_d-1}-1 2gd−1−1 (除去空集)个,产生 1
贡献的会有 2 g d − 1 2^{g_d-1} 2gd−1 个,那么当 g d > 0 g_d>0 gd>0 时, b d b_d bd 的值就会恒为1
。
那么 b d b_d bd 就可以表示为 b d = [ g d > 0 ] b_d=[g_d>0] bd=[gd>0]。
这样我们就可以 O ( n log n ) O(n\log n) O(nlogn) 求出 b d b_d bd 然后反演求出 a d a_d ad再算式子的值即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)(这里的 n n n 指值域)。
毒瘤题。
忘了干了些什么了
真是一道好的CSP模拟赛,前两题PJ难度,后两题完全不可做…区分度全在卡常和挂题上面了…比省选更逆向区分的题…
出题人写题解也很用心呢…
Emmm…min-max容斥板题都来了…
E [ S ] = ∑ T ≠ ∅ , T ⊆ S ( − 1 ) ∣ T ∣ + 1 1 ∑ i ∈ T p i E[S]=\sum_{T≠∅,T⊆S}(-1)^{|T|+1}\frac{1}{\sum_{i\in T}p_i} E[S]=T=∅,T⊆S∑(−1)∣T∣+1∑i∈Tpi1
O ( 2 n ) O(2^n) O(2n) 枚举即可,做完了。
事实上状压dp也可以解决做这个问题…
题目描述特别长一大串
注意到每轮人数都会减半,模拟即可。
复杂度: O ( n log n ) O(n\log n) O(nlogn)
码农题…码了三个中午都没码完…