数论出题组比赛用题:公约数

T4:公约数

思考难度:提高?

代码难度:省选-?

算法1:暴力计算

实际得分:10

算法2:

首先 gcd ( i j , i k , j k ) = gcd ( i , j ) × gcd ( i , k ) × gcd ( j , k ) gcd ( i , j , k ) \gcd(i\cdot j,i\cdot k,j\cdot k)=\frac{\gcd(i,j)\times \gcd(i,k)\times \gcd(j,k)}{\gcd(i,j,k)} gcd(ij,ik,jk)=gcd(i,j,k)gcd(i,j)×gcd(i,k)×gcd(j,k)

所以原式 = i = 1 n j = 1 m k = 1 p ( gcd 2 ( i , j ) + gcd 2 ( i , k ) + g c d 2 ( j , k ) ) =\sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^p(\gcd^2(i,j)+\gcd^2(i,k)+gcd^2(j,k)) =i=1nj=1mk=1p(gcd2(i,j)+gcd2(i,k)+gcd2(j,k))

考虑一个式子 i = 1 n j = 1 m gcd 2 ( i , j ) = d = 1 min ( n , m ) x d d 2 μ ( x d ) \sum_{i=1}^n\sum_{j=1}^m\gcd^2(i,j)=\sum_{d=1}^{\min(n,m)}\sum_{x|d}d^2\mu\left(\frac{x}{d}\right) i=1nj=1mgcd2(i,j)=d=1min(n,m)xdd2μ(dx)

考虑对后面的 \sum 分块计算, O ( n + T n n ) O(n+T\cdot n\sqrt{n}) O(n+Tnn )

实际得分:30

算法3:

发现前面的 \sum 也可以分块, O ( n + T n ) O(n+T\cdot n) O(n+Tn)

实际得分:50

算法4:

考虑令 f ( x ) = x 2 , g ( x ) = μ ( x ) f(x)=x^2,g(x)=\mu\left({x}\right) f(x)=x2,g(x)=μ(x),计算这两个函数的狄利克雷卷积 h ( x ) h(x) h(x),再对 h ( x ) h(x) h(x)分块计算, O ( n + T n ) O(n+T\cdot \sqrt{n}) O(n+Tn )

实际得分:100

算法5:

杜教筛一下,把预处理复杂度由 O ( n ) O(n) O(n)降低为 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32)我太懒了没有学杜教筛

实际得分:100

全部评论

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务