[国家集训队]Crash的数字表格

Link
如题,给定$N$和$M$,求

有人说这道题是BZOJ上面的JZPTAB,但其实不是,JZBTAB虽然具体问题和改题是一样的,但是那道题是多组询问,比这道题还要难一些。
首先我们知道$lcm(i,j) = \frac{i \times j}{gcd(i,j)}$,那么题目转化为

然后我们枚举最大公约数,式子转化为

提出d,式子变成

并且我们知道

直接带入上面的式子可以得到

保留前缀和$S[i]$,优先枚举$x$。

优先枚举$S$

对于其中的$f(dx) = dx \sum_{e|dx}e \mu(dx)$可以线性筛,有式子

之后的式子可以整除分块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std ;

typedef long long LL ;
const int MAXN = 10000010 ;
const int MAXM = 10000010 ;
const int Mod = 20101009 ;

int N, M, F[MAXN], P[MAXN], Tot ;
bool V[MAXN] ; int Sum[MAXN], Ans ;

inline int Read() {
int X = 0, F = 1 ; char ch = getchar() ;
while (ch > '9' || ch < '0') F = (ch == '-' ? - 1 : 1), ch = getchar() ;
while (ch >= '0' && ch <= '9') X=(X<<1)+(X<<3)+(ch^48), ch = getchar() ;
return X * F ;
}

inline int MOD (int Now) {
if (Now >= Mod) return Now - Mod ;
else return Now ;
}

inline void Init() {
F[1] = 1 ;
for (int i = 2 ; i <= min(N, M) ; i ++) {
if (! V[i]) {
P[++ Tot] = i, F[i] = MOD (Mod + 1 - i) ;
}

for (int j = 1 ; j <= Tot && i * P[j] <= min(N, M) ; j ++) {
V[i * P[j]] = true ;
if (i % P[j]) F[i * P[j]] = 1LL * F[i] * F[P[j]] % Mod ;
else {
F[i * P[j]] = F[i] ;
break ;
}
}
}

for (int i = 1 ; i <= min(N, M) ; i ++)
F[i] = MOD(F[i - 1] + 1ll * F[i] * i % Mod) ;
for (int i = 1 ; i <= max(N, M) ; i ++)
Sum[i] = MOD(Sum[i - 1] + i) ;
}

int main() {
N = Read() ; M = Read() ; Init() ; Ans = 0 ;
for (int l = 1, r ; l <= min(N, M) ; l = r + 1) {
r = min(N / (N / l), M / (M / l)) ;
int Ans2 = MOD(F[r] - F[l - 1] + Mod) ;
Ans = MOD(Ans + 1LL * Ans2 * Sum[N / l] % Mod * Sum[M / l] % Mod) ;
}
printf("%d", Ans % Mod) ;
return 0 ;
}

这道题的式子确实难推,但是时间复杂度化简到$O(N)$左右也就可以了,据说BZOJ上面的题目是真正的JZPTAB是多组数据,时间复杂度要推倒$O(\sqrt N)$才行。至于那种级别的题目,即使没有眼见为实,笔者也是有做不了的自知之明的…如果有想要了解的朋友还请另寻高就吧。

本文标题:[国家集训队]Crash的数字表格

文章作者:Sue Shallow

发布时间:2019年02月16日 - 11:35:36

最后更新:2019年11月11日 - 19:55:07

原始链接:http://Yeasion.github.io/2019/02/16/国家集训队-Crash的数字表格/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。