2020杭电多校赛 Multi-University Training Contest

2020杭电多校赛 Multi-University Training Contest

第一场多校 出题人 朝鲜MUTC KUT Round

1005_6755 Fibonacci Sum: 二次剩余_Fib的k次幂和

链接
传送门: here
题意
1 ≤ n , c ≤ 1 e 18 , 1 ≤ k ≤ 1 e 5 1\le n,c\le1e18, 1\le k\le 1e51n,c1e18,1k1e5
F i b 1 = 1 , F i b 1 = 1 , F i b n = F i b n − 1 + F i b n − 2 Fib1=1,Fib1=1,Fib_n=Fib_{n-1}+Fib_{n-2}Fib1=1,Fib1=1,Fibn=Fibn1+Fibn2
F i b 0 k + F i b c k + F i b 2 c k + . . . + F i b n c k , m o d = 1 e 9 + 9 Fib_0^k+Fib_{c}^k+Fib_{2c}^k+...+Fib_{nc}^k,\;mod=1e9+9Fib0k+Fibck+Fib2ck+...+Fibnck,mod=1e9+9

前请提要
有关取模、同余、逆元的一些东西:
f i b [ n ] = 5 5 × [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] fib[n] = \frac{\sqrt5}{5}\times [(\frac{1+\sqrt5}{2})^n-(\frac{1-\sqrt5}{2})^n]fib[n]=55×[(21+5)n(215)n]
p = 1 e 9 + 9 p = 1e9 + 9p=1e9+9
二次剩余:
38300801 6 2 ≡ 5 ( m o d p ) 383008016^2 ≡ 5 (mod\;p)38300801625(modp)
383008016 ≡ 5 ( m o d p ) 383008016 ≡ \sqrt5 (mod\;p)3830080165(modp)
1 5 ≡ 276601605 ( m o d p ) \frac{1}{\sqrt5}≡276601605(mod\;p)51276601605(modp)
383008016 的 逆 元 = 276601605 383008016的逆元 = 276601605383008016=276601605
( 1 + 5 ) / 2 ≡ 691504013 ( m o d p ) (1+\sqrt5)/2≡691504013(mod\;p)(1+5)/2691504013(modp)
383008017 × 2 的 逆 元 = 691504013 383008017\times 2的逆元 = 691504013383008017×2=691504013
( 1 − 5 ) / 2 ≡ 308495997 ( m o d p ) (1-\sqrt5)/2≡308495997(mod\;p)(15)/2308495997(modp)
( p − 383008016 + 1 ) × 2 的 逆 元 = 308495997 (p-383008016+1)\times 2的逆元 = 308495997(p383008016+1)×2=308495997

f i b [ n ] = 276601605 × [ ( 691504013 ) n − ( 308495997 ) n ] ( m o d p ) fib[n] = 276601605\times [(691504013)^n-(308495997)^n] (mod\;\;p)fib[n]=276601605×[(691504013)n(308495997)n](modp)
f i b fibfibn nn项和等比数列求和:s u m = a a − 1 × ( a n − 1 ) ( m o d p ) = a 2 ( a n − 1 ) ( m o d p ) = a n + 2 − a 2 ( m o d p ) sum = \frac{a}{a-1} \times (a^n - 1) (mod\;\;p) = a^2(a^n-1)(mod\;\;p)=a^{n+2}-a^2(mod\;\;p)sum=a1a×(an1)(modp)=a2(an1)(modp)=an+2a2(modp)
p = 1 e 9 + 9 , a = 691504013 或 308495997 时 成 立 p=1e9+9, a = 691504013或308495997时成立p=1e9+9,a=691504013308495997
思路
通过上面我们知道,在模p = 1 e 9 + 9 p=1e9+9p=1e9+9意义下有:
f i b [ n ] = 276601605 × [ ( 691504013 ) n − ( 308495997 ) n ] ( m o d p ) = d × ( a n − b n ) fib[n] = 276601605\times [(691504013)^n-(308495997)^n] (mod\;\;p)=d\times(a^n-b^n)fib[n]=276601605×[(691504013)n(308495997)n](modp)=d×(anbn)
f i b n c = d × ( a c n − b c n ) = d × ( A n − B n ) = F i b C n , A = a c , B = b c fib_{nc}=d\times(a^{cn}-b^{cn})=d\times(A^n-B^n)=FibC_n,\;A=a^c,B=b^cfibnc=d×(acnbcn)=d×(AnBn)=FibCnA=ac,B=bc
( 1 d f i b n c ) k (\frac1dfib_{nc})^k(d1fibnc)k二项式展开有:
C k 0 ( A n ) k + ( − 1 ) 1 C k 1 ( A n ) k − 1 ( B n ) + ( − 1 ) 2 C k 2 ( A n ) k − 2 ( B n ) 2 + . . . + ( − 1 ) r C k r ( A n ) k − r ( B n ) r + . . . + ( − 1 ) k − 1 C k k − 1 ( A n ) ( B n ) k − 1 + ( − 1 ) k C k k ( B n ) k C_k^0(A^n)^k+(-1)^1C_k^1(A^n)^{k-1}(B^n)+(-1)^2C_k^2(A^n)^{k-2}(B^n)^2+...+(-1)^rC_k^r(A^n)^{k-r}(B^n)^r+...+(-1)^{k-1}C_k^{k-1}(A^n)(B^n)^{k-1}+(-1)^kC_k^k(B^n)^kCk0(An)k+(1)1Ck1(An)k1(Bn)+(1)2Ck2(An)k2(Bn)2+...+(1)rCkr(An)kr(Bn)r+...+(1)k1Ckk1(An)(Bn)k1+(1)kCkk(Bn)k
C k 0 ( A k ) n + ( − 1 ) 1 C k 1 ( A k − 1 ) n ( B ) n + ( − 1 ) 2 C k 2 ( A k − 2 ) n ( B 2 ) n + . . . + ( − 1 ) r C k r ( A k − r ) n ( B r ) n + . . . + ( − 1 ) k − 1 C k k − 1 ( A ) n ( B k − 1 ) n + ( − 1 ) k C k k ( B k ) n C_k^0(A^k)^n+(-1)^1C_k^1(A^{k-1})^n(B)^n+(-1)^2C_k^2(A^{k-2})^n(B^2)^n+...+(-1)^rC_k^r(A^{k-r})^n(B^r)^n+...+(-1)^{k-1}C_k^{k-1}(A)^n(B^{k-1})^n+(-1)^kC_k^k(B^k)^nCk0(Ak)n+(1)1Ck1(Ak1)n(B)n+(1)2Ck2(Ak2)n(B2)n+...+(1)rCkr(Akr)n(Br)n+...+(1)k1Ckk1(A)n(Bk1)n+(1)kCkk(Bk)n
现在我们要求F i b C FibCFibC的前n nn项和,我们O ( k ) O(k)O(k)枚举C k r C_k^rCkr,逐项求出前n nn项和再累加即可。
对于( − 1 ) r C k r (-1)^rC_k^r(1)rCkr而言,令a = A k − r B r a=A^{k-r}B^ra=AkrBr,前n nn项和为( − 1 ) r C k r × a × ( a n − 1 ) a − 1 (-1)^rC_k^r\times\frac {a\times(a^n-1)}{a-1}(1)rCkr×a1a×(an1)
可以加的几个优化:

  • 欧拉降幂,n , c ≤ 1 e 18 , p = 1 e 9 + 9 n,c\le1e18,p=1e9+9n,c1e18,p=1e9+9a n ( m o d p ) = a n % ϕ ( p ) ( m o d p ) a^n(mod \;p)=a^{n\%\phi(p)}(mod\;p)an(modp)=an%ϕ(p)(modp) ^_^
  • a = A k − r B r a=A^{k-r}B^ra=AkrBr没有必要预处理,我们可以在线求,令a = A k a=A^ka=Ak,然后a = a ∗ b ∗ i n v ( a ) a=a*b*inv(a)a=abinv(a)即可
  • 同理a n a^nan也可以在线求,然后就过了。

备注
参考:ACDreamers
AC_CODE
here

1006_6756 Finding a MEX: 分块_线段树_树状数组

链接
传送门: here
题意
n , m , q ≤ 1 e 5 n,m,q\le 1e5n,m,q1e5无向图, S u = { A v ∣ ( u , v ) ∈ E } S_u=\{A_v|(u,v)\in E\}Su={Av(u,v)E},F u = m e x ( S u ) F_u=mex(S_u)Fu=mex(Su)
t y p e 1 : 1 u x , c h a n g e A u = x type 1: 1\;u\;x, change\;A_u = xtype1:1ux,changeAu=x
t y p e 2 : 2 u , q u e r y F u type 2: 2\;u, query\;F_utype2:2u,queryFu
思路
度数大于m \sqrt mm的超级点不超多m \sqrt mm个。
小点暴力算,超级点用分块或者bit,线段树
分块复杂度O ( n ∗ n ) O(n*\sqrt n)O(nn), 1170ms
线段树复杂度O ( n ∗ n ∗ l o g ( n ) ) O(n*\sqrt n*log(n))O(nnlog(n)), 1560MS
树状数组+二分求mex复杂度O ( n ∗ n ∗ l o g ( n ) ∗ l o g ( n ) ) O(n*\sqrt n*log(n)*log(n))O(nnlog(n)log(n)), 1092MS
树状数组求mex复杂度O ( n ∗ n ∗ l o g ( n ) ∗ l o g ( n ) ) O(n*\sqrt n*log(n)*log(n))O(nnlog(n)log(n)), 1762MS
动态开点线段树TLE
分块维护每个块内数字第一次出现的次数,O ( n ) O(\sqrt n )O(n)修改,O ( n ) O(\sqrt n )O(n)查询
线段树维护mex其实就是维护最小值
备注

AC_CODE
分块线段树树状数组求mex树状数组+二分求mex

1009_6759 Leading Robots: 优先队列贪心

链接
传送门: here
题意
n ( 1 e 5 ) n(1e5)n(1e5)辆车在数轴正半轴,每个车在初始位置在p i p_ipi、初速度0 00,加速度a i a_iai,可能有车信息完全相同,问有多少辆车存在某一个时刻它走在当之无愧的第一名,也就是没有并列。
思路
1.把所有车子u n i q u e uniqueunique一下,相同车子记录他的个数(当然如果它个数大于1 11,我是不会算它的贡献滴)
2.用单调栈预处理一下,去掉永远不可能在第一位的车子。
3.用r s [ ] rs[]rs[]记录每个车子下一个要超过的车子的编号
4.优先队列保存每个车子i ii超过车子r s [ i ] rs[i]rs[i]的时间,优先队列每次取出时间最短的那个车子
6.判断他是否超车到了第一位,若是就记录,并且若这是最初排在最后一位的车子就break结束
5.然后去掉r s [ i ] rs[i]rs[i]这个车子,因为他还没到第一就已经被车子i ii超车了
6.复杂度O ( n ∗ l o g ( n ) ) O(n*log(n))O(nlog(n))
备注
去年多校也有一个车子过红绿灯贪心题HDU Vacation
AC_CODE
here


第二场多校 出题人 Claris

1007 In Search of Gold: 二分+树dp

链接
传送门: here
题意
n ( 2 e 4 ) , k ( 20 ) n(2e4),k(20)n(2e4),k(20)n nn个节点的树,每条边有两种长度属性( a , b ) (a,b)(a,b),已知恰好有k kk条边长度
属性为a aa,其他边均为b bb,问这种树的直径最小可能时多少。
思路
二分答案+树形DP
初始化d p [ u ] [ 0 ] = 0 , d p [ u ] [ 1 − k ] = I N F dp[u][0]=0,dp[u][1-k]=INFdp[u][0]=0,dp[u][1k]=INF
d p [ u ] [ i ] dp[u][i]dp[u][i]表示u的子树内有i ii条边选择树形值a aa的情况下的最长叶子路径
状态转移时确保直径小于等于m i d midmid即可。
d p [ 1 ] [ k ] ≤ m i d dp[1][k]\le middp[1][k]mid表示有解。
备注
AC_CODE
here


第三场多校 出题人 Tokitsukaze and Her Friends

1006_6796 X Number: 数位dp

链接
传送门: here
题意
f ( x ) f(x)f(x)等于x xx中出现次数最多的那一个数字。
l , r l,rl,r中有几个数字f ( x ) = d , 0 ≤ d ≤ 9 f(x)=d,0\le d\le 9f(x)=d,0d9.
思路
数 位 d p 数位dpdp同时要记录前面各位选的数字的次数,可用大小为10 1010a r r a y arrayarray存起来
为了保证能正确的记忆化,这个a r r a y arrayarray应该占d p dpdp的一维状态,所以只能用m a p mapmap表示d p dpdp状态
m a p < a r r a y < i n t , 10 > , i n t 64 > d p [ d ] [ p o s ] [ l e a d Z e r o ] map<array<int, 10>, int64> dp[d][pos][leadZero]map<array<int,10>,int64>dp[d][pos][leadZero]
表示只考虑d dd类数,p o s pospos前的位数,是否有前导0 00,数字使用情况为a r r a y arrayarray的合法方案数。
仅当! l i m i t !limit!limit时才记忆化。

当数字使用情况为a r r a y arrayarray所记录,且还能使用p o s pospos位任意0 − 9 0-909数字时,想要让众数为d的方案数
可以使用母 函 数 D P 母函数DPDP写出来,复杂度O ( n 4 ) O(n^4)O(n4)

算法时间复杂度我猜为 O ( 进 制 数 ∗ 位 数 + 进 制 数 ∗ 新 增 状 态 数 ∗ 1 8 4 ) O(进制数*位数+进制数*新增状态数*18^4)O(+184)
备注

AC_CODE
here


第四场多校 出题人 Hangzhou Xuejun Contest


第五场多校 出题人 福州大学

1007 Tree: 优先队列贪心维护换根dp

链接
传送门: here
题意
n ( 2 e 5 ) n(2e5)n(2e5)个点的带边权的树,选出一个连通子图,保证至多只有一个点的度数可以大
k ( 0 ≤ k < n ) k(0\le k\lt n)k(0k<n),问这种子图的最大边权和。
思路
换根d p dpdp+优先队列贪心
d p [ u ] [ 0 ] dp[u][0]dp[u][0]表示至多选出u uuk − 1 k-1k1个子树的最大边权和
d p [ u ] [ 1 ] dp[u][1]dp[u][1]表示至多选出u uuk kk个子树的最大边权和
d p [ u ] [ 1 ] = ∑ m a x k v ( d p [ v ] [ 0 ] + w u v ) dp[u][1] = \sum_{max\;k\;v} (dp[v][0]+w_{uv})dp[u][1]=maxkv(dp[v][0]+wuv)
选出最大的k kkd p [ v ] [ 0 ] + w u v dp[v][0]+w_{uv}dp[v][0]+wuv转移即可,优先队列贪心维护最大的k kk个。
k _ s o n _ v a l [ u ] k\_son\_val[u]k_son_val[u]表示u uu的第k kk大的子树权值和:d p [ v ] [ 0 ] + w u v dp[v][0]+w_{uv}dp[v][0]+wuv
m a x _ k 1 _ s o n [ v ] max\_k1\_son[v]max_k1_son[v]表示v vv是否属于其父亲子树中权值和最大的k − 1 k-1k1个子树
备注

AC_CODE
here

第六场多校 出题人 USETC

1001 Road To The 3rd Building: 期望线性性

链接
传送门: here
题意
n ( 2 e 5 ) n(2e5)n(2e5)的序列,求每个区间平均值的期望。
思路
算每个数字的期望加起来即可。
备注
AC_CODE
here

1005 Fragrant numbers: 区间DP

链接
传送门: here
题意
求114514191911451419191145141919一个最短前缀,添加任意(,),+,*后数值为n ( 5000 ) n(5000)n(5000).
思路
O ( 1 3 3 ∗ n 2 ) O(13^3*n^2)O(133n2)区间dp即可。
备注

1007 A Very Easy Math Problem: 莫比乌斯反演

链接
传送门: here
题意
T ≤ 1 e 4 , n ≤ 2 e 5 , k , x ≤ 1 e 9 T\le1e4,n\le2e5,k,x\le1e9T1e4,n2e5,k,x1e9
求:
∑ a 1 = 1 n . . . ∑ a x = 1 n ( ∏ j = 1 x a j k ) × f ( g c d ( a 1 , . . . , a x ) ) × g c d ( a 1 , . . . , a x ) \sum_{a_1=1}^n...\sum_{a_x=1}^n(\prod_{j=1}^xa_j^k)\times f(gcd(a_1,...,a_x))\times gcd(a_1,...,a_x)a1=1n...ax=1n(j=1xajk)×f(gcd(a1,...,ax))×gcd(a1,...,ax)
思路
∑ a 1 = 1 n . . . ∑ a x = 1 n ( ∏ j = 1 x a j k ) = ( ∑ i = 1 n i k ) x \sum_{a_1=1}^n...\sum_{a_x=1}^n(\prod_{j=1}^xa_j^k)=(\sum_{i=1}^ni^k)^xa1=1n...ax=1n(j=1xajk)=(i=1nik)x
容易推导出:
⇓ \Downarrow
∑ d = 1 n f ( d ) d x k ∑ p = 1 n d μ ( p ) × p x k × S ( n p d ) \sum_{d=1}^nf(d)d^{xk}\sum_{p=1}^{\frac nd}\mu(p)\times p^{xk}\times S(\frac n{pd})d=1nf(d)dxkp=1dnμ(p)×pxk×S(pdn)
比赛时的测评机全部预处理O ( n × n + T n ) O(n\times \sqrt n+T\sqrt n)O(n×n+Tn)即可通过,比赛后的测评机记忆化处理也能过。
还可以进一步优化。
⇓ \Downarrow
T = p d , ∑ T = 1 n S ( n T ) × T x k ∑ p ∣ T μ ( p ) f ( T p ) T=pd,\sum_{T=1}^nS(\frac nT)\times T^{xk}\sum_{p|T}\mu(p)f(\frac Tp)T=pd,T=1nS(Tn)×TxkpTμ(p)f(pT)
备注
由于出题人不卡时限,所以O ( n × l o g ( n ) + T n ) O(n\times log(n)+T\sqrt n)O(n×log(n)+Tn)或者O ( n + T n ) O(n+T\sqrt n)O(n+Tn)均可以通过。
AC_CODE
here
线性筛代码:

const int mod = 1e9 + 7;
int fpow (int a, int b) { int ret = 1; while (b) { if (b & 1) ret = 1ll * ret * a % mod; a = 1ll * a * a % mod; b >>= 1; } return ret; }
int add (int a, int b) { return (a += b) >= mod ? a - mod : a; }
int sub (int a, int b) { return (a -= b) >= 0 ? a : a + mod; }
int mul (long long a, int b) { return a * b % mod; }
int inv (int a) { return fpow(a, mod - 2); }
int p[N], pc;
bool ptag[N];
int f[N], low[N];
void sieve (int n = N - 1) {
	f[1] = low[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (!ptag[i]) {
			p[++ pc] = i;
			f[i] = sub(i, 1);
			low[i] = i;
		}
		for (int j = 1, k; j <= pc && i * p[j] <= n; j++) {
			ptag[k = i * p[j]] = 1;
			if (i % p[j]) {
				low[k] = p[j];
				f[k] = mul(f[i], f[p[j]]);
			} else {
				low[k] = low[i] * p[j];
				if (low[i] == i) {
					if (low[i] == p[j])
						f[k] = sub(mod, p[j]);
					else 
						f[k] = 0;
				} else
					f[k] = mul(f[i / low[i]], f[low[i] * p[j]]);
				break;
			}
		}
	}
}

1008 Yukikaze and Smooth numbers: min25筛

待补


CCPC网络赛 出题人:北大出题组

Xor: 数位dp

题意
T : 2 e 3 T:2e3T:2e3, a b c d : 1 e 9 abcd:1e9abcd:1e9
问有多少对( x , y ) (x, y)(x,y)满足∣ x − y ∣ ≤ c |x-y|\le cxycx ⨁ y ≤ d , 0 ≤ x ≤ a , 0 ≤ y ≤ b x\bigoplus y \le d, 0\le x\le a, 0\le y\le bxyd,0xa,0yb
链接:点我点我
思路
两个限制条件:

  • x o r xorxor
    ip1 = 1 means equal to c, ip1 = 0 means less than c
  • a b s absabs
    ∣ x − y ∣ ≤ m ⟹ x − y ≤ m & & x − y ≥ − m |x - y| \leq m\Longrightarrow\;\; x-y \le m\;\&\&\;x-y\ge -mxymxym&&xym
    ⟹ m − x + y > = 0 & & m + x − y > = 0 \Longrightarrow m - x + y >= 0\;\&\&\;m + x - y >= 0mx+y>=0&&m+xy>=0.
    m , x , y m, x, ym,x,y 可取 0 或 1, 上述式子取值可以是 − 1 , 0 , 1 , 2 -1, 0, 1, 21,0,1,2.
    [ 高 位 ] ≥ 1 [高位] \ge 1[]1 , 后面数位就算全取-1最后结果还满足条件,x , y x,yx,y取值不受限制。此位就算大于1也可以按1考虑;
    [ 高 位 ] < − 1 [高位] \lt -1[]<1 ,后面就算全取2也一定不行 ,所以直接返回0就行;
    又因为只有两个值同时大于等于1的时候才可以返回1。
    所以只需考虑上述式子取值为1或0或-1的情况。
    为避免负数下标,令-1为0,0为1,1为2

AC_CODE
here


版权声明:本文为qq_39599067原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。