Codechef October Challenge 2019 Division 1 solutions

Chef and Maximum Star Value

显然如果一个数后面有它的因数,那么它一定不可能是最大值。先从后往前枚举一遍把这些数去掉,再从前往后做一遍,每个数枚举它所有倍数统计即可。
因为每个数最多只会做一次,时间复杂度是 O ( T A i log ⁡ A i ) O(TA_i\log A_i) O(TAilogAi)

代码

Array Modification

考虑每次遍历对于每一对 ( a , b ) (a,b) (a,b) 的影响:
( a , b ) → ( a   x o r   b , a ) → ( b , a   x o r   b ) → ( a , b ) (a,b)\rightarrow (a~xor~b, a)\rightarrow (b,a~xor~b)\rightarrow (a,b) (a,b)(a xor b,a)(b,a xor b)(a,b)
所以判下总共会有几次完全遍历 0 0 0 n − 1 n-1 n1,再把剩下的做一次就可以了。
要特判 i = n − i − 1 i = n-i-1 i=ni1 的情况。
时间复杂度 O ( T N ) O(TN) O(TN)

代码

Even Edges

对于 k ≥ 4 k\geq4 k4 的情况,如果某 2 2 2 组点间有偶数条边,那么显然可以将它们合并。如果所有组之间都是奇数条边,那么任意选出 4 4 4 组合并成 1 1 1 组,这一组的边数也是偶数。
因此 k ≤ 3 k\le 3 k3
m m m 为偶数时显然 k k k 即为 1 1 1
否则,若原图中有一个点度数为奇数,将它隔离后剩下的点的边数即为偶数,于是 k = 2 k=2 k=2
而若原图中所有点度数都为偶数,那么无论怎么隔离出一组点,其与剩下的点间的边数一定是偶数,所以不可能 2 2 2 组点内部的边数都为偶数。此时 k = 3 k=3 k=3
至于 k = 3 k=3 k=3 时求出一个合法的答案,只需要找出一条边 ( u , v ) (u,v) (u,v) u u u v v v、剩下的点各成一组即可。

代码

Bacterial Reproduction

对于非叶子节点 u u u,它某个祖先 v v v t 0 t_0 t0 时刻的操作对它在 t 1 t_1 t1产生影响的条件是 t 1 = t 0 + d u − d v t_1=t_0+d_u-d_v t1=t0+dudv,即 t 1 − d u = t 0 − d v t_1-d_u=t_0-d_v t1du=t0dv
如果 u u u 是叶子节点,就变为 t 1 − d u ≥ t 0 − d v t_1-d_u\geq t_0-d_v t1dut0dv
那么离线之后遍历一遍树,记录下这些值就好了。
时间复杂度 O ( N + Q ) O(N+Q) O(N+Q)

代码

Queries on Matrix

假设最终有 r r r 行被加了奇数次, c c c 列被加了奇数次,那么最终为奇数的格子数是 r ( m − c ) + c ( n − r ) r(m-c)+c(n-r) r(mc)+c(nr),因此可以算出有哪些 ( r , c ) (r,c) (r,c) 满足条件。
对于每对 ( r , c ) (r,c) (r,c),显然可以分开计算行和列的方案数,最后再乘起来。
以行为例,问题转化为用 1 − n 1-n 1n Q Q Q 个位置,使得恰好有 r r r 个数的出现次数为奇数。这个可以用生成函数做,答案即为
( x 1 ! + x 3 3 ! + x 5 5 ! + . . . ) r ( 1 + x 2 2 ! + x 4 4 ! + . . . ) n − r ( n r ) Q !   [ x Q ] ({x\over 1!}+{x^3\over 3!}+{x^5\over 5!}+...)^r(1+{x^2\over 2!}+{x^4\over 4!}+...)^{n-r}{n\choose r}Q!~[x^Q] (1!x+3!x3+5!x5+...)r(1+2!x2+4!x4+...)nr(rn)Q! [xQ]
( e x − e − x 2 ) r ( e x + e − x 2 ) n − r ( n r ) Q !   [ x Q ] ({e^x-e^{-x}\over 2 })^r({e^x+e^{-x}\over 2 })^{n-r}{n\choose r}Q!~[x^Q] (2exex)r(2ex+ex)nr(rn)Q! [xQ]
( ∑ i = 0 r e ( 2 i − r ) x ( − 1 ) r − i ( r i ) ) ( ∑ j = 0 n − r e ( 2 j − n + r ) x ( n − r j ) ) 1 2 n ( n r ) Q !   [ x Q ] (\sum_{i=0}^re^{(2i-r)x}{(-1)^{r-i}}{r\choose i})(\sum_{j=0}^{n-r}e^{(2j-n+r)x}{n-r\choose j}){1\over {2^n}}{n\choose r}Q!~[x^Q] (i=0re(2ir)x(1)ri(ir))(j=0nre(2jn+r)x(jnr))2n1(rn)Q! [xQ]
先枚举 i + j i+j i+j :
( ∑ s = 0 n e ( 2 s − n ) x ∑ i = 0 s ( − 1 ) r − i ( r i ) ( n − r s − i ) ) 1 2 n ( n r ) Q !   [ x Q ] (\sum_{s=0}^ne^{(2s-n)x}\sum_{i=0}^s{(-1)^{r-i}}{r\choose i}{n-r\choose s-i}){1\over {2^n}}{n\choose r}Q!~[x^Q] (s=0ne(2sn)xi=0s(1)ri(ir)(sinr))2n1(rn)Q! [xQ]
f ( n , r , s ) = ∑ i = 0 s ( − 1 ) r − i ( r i ) ( n − r s − i ) f(n,r,s)=\sum_{i=0}^s{(-1)^{r-i}}{r\choose i}{n-r\choose s-i} f(n,r,s)=i=0s(1)ri(ir)(sinr)
( ∑ s = 0 n e ( 2 s − n ) x f ( n , r , s ) ) 1 2 n ( n r ) Q !   [ x Q ] (\sum_{s=0}^ne^{(2s-n)x}f(n,r,s)){1\over {2^n}}{n\choose r}Q!~[x^Q] (s=0ne(2sn)xf(n,r,s))2n1(rn)Q! [xQ]
( ∑ s = 0 n ∑ i = 0 ∞ ( 2 s − n ) i x i i ! f ( n , r , s ) ) 1 2 n ( n r ) Q !   [ x Q ] (\sum_{s=0}^n\sum_{i=0}^{\infin} {(2s-n)^ix^i\over i!}f(n,r,s)){1\over {2^n}}{n\choose r}Q!~[x^Q] (s=0ni=0i!(2sn)ixif(n,r,s))2n1(rn)Q! [xQ]
( ∑ s = 0 n ( 2 s − n ) Q f ( n , r , s ) ) 1 2 n ( n r ) (\sum_{s=0}^n(2s-n)^Qf(n,r,s)){1\over {2^n}}{n\choose r} (s=0n(2sn)Qf(n,r,s))2n1(rn)
现在的问题就是对每个 n , r n,r n,r,如何快速求出 f ( n , r , s ) f(n,r,s) f(n,r,s) s = 0... n s=0...n s=0...n 的值。
因为
f ( n , r , s ) = ( x − 1 ) r ( x + 1 ) n − r   [ x s ] f(n,r,s)=(x-1)^r(x+1)^{n-r}~[x^s] f(n,r,s)=(x1)r(x+1)nr [xs]
可以先预处理出 ( x − 1 ) k , ( x + 1 ) k ( k = 0... n ) (x-1)^k,(x+1)^k(k=0...n) (x1)k,(x+1)k(k=0...n),然后对每个 ( n , r ) (n,r) (n,r) NTT 乘一遍得到 ( x − 1 ) r ( x + 1 ) n − r (x-1)^r(x+1)^{n-r} (x1)r(x+1)nr,于是就可以求出 f ( n , r , s ) f(n,r,s) f(n,r,s) s = 0... n s=0...n s=0...n 的值。
然后发现还是 T 了…
那么不妨再进一步,预处理出 ( x − 1 ) k , ( x + 1 ) k ( k = 0.. n ) (x-1)^k,(x+1)^k(k=0..n) (x1)k,(x+1)k(k=0..n) 对在做 NTT 时每个可能的 m = 2 i m=2^i m=2i 的 NTT 后的多项式,这样就可以在做每对 ( n , r ) (n,r) (n,r) 时少做 2 2 2 次 NTT 。
然后就卡过去了。
时间复杂度 O ( n 2 log ⁡ 2 n + T n 2 log ⁡ n ) O(n^2\log^2 n+Tn^2\log n) O(n2log2n+Tn2logn)

代码

Faulty System

挖坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值