Crash的数字表格
Description
今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple)。对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数。例如,LCM(6, 8) = 24。回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格。每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j)。一个4 * 5的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12 15 4 4 12 4 20 看着这个表格,Crash想到了很多可以思考的问题。不过他最想解决的问题却是一个十分简单的问题:这个表格中所有数的和是多少。当N和M很大时,Crash就束手无策了,因此他找到了聪明的你用程序帮他解决这个问题。由于最终结果可能会很大,Crash只想知道表格里所有数的和mod 20101009的值。
Input
输入的第一行包含两个正整数,分别表示 (N) 和 (M)。
Output
输出一个正整数,表示表格中所有数的和(mod 20101009)的值。
Sample Input
(4 5)
Sample Output
(122)
【数据规模和约定】
100%的数据满足(N, M ≤ 10^7)。
由题可得:我们应该求的是 (sum_{i =1} ^ n sum_{j=1}^m lcm(i,j)) (不妨设 (n<=m))
先可以由原式化简:
(ans = sum_{i=1}^n sum_{j=1}^n frac{ij}{gcd(i,j)})
(ans = sum_{d=1}^n sum_{i=1}^{lfloorfrac{n}{d} floor} sum_{j=1}^{lfloorfrac{m}{d} floor} [gcd(i,j)=1] ijd)
经过最开始的基本化简以后,既然这道题和 (gcd) 有许许多多不可描述的关系,我们可以考虑莫比乌斯反演。
既然要用莫比乌斯反演,我们就应该来构造相应的 (f(x)) 和 (F(x))
我们设 (f(x, y, k)) 表示 (sum_{i=1}^x sum_{j=1}^y [gcd[i,j]=k] ij)
再设 (F(x,y,t)) 表示 (sum_{i=1}^x sum_{j=1}^y [tmid gcd(i,j)]ij)
( herefore ans=sum_{d=1}^n d f(lfloorfrac{n}{d} floor,lfloorfrac{m}{d} floor,1))
现在,我们来仔细观察一下 (F(x,y,t)) 和 (f(x,y,k)) 两个函数的关系
(F(x,y,t)=sum_{tmid d} f(x,y,d))
由莫比乌斯反演后可得:
(f(x,y,d)=sum_{dmid t} mu(frac{t}{d}) F(x,y,t))
(ecause d=1)
( herefore f(x,y,1)=sum_{t=1}^x mu(t) F(x,y,t))
现在,我们回过头了思考一下我们上面一系列操作的意义:
我们由题目要求推得我们需要求 (f(x,y,1))
但是我们发现直接求并不好求,所以我们反演以后转化为去求 (F(x,y,t)) 再进一步求得 (ans)
既然我们转化为 (F(x,y,t)) ,那么这个函数应该要比较方面我们求值才可以达到我们的要求
所以我们来考虑一下 (F(x,y,t)) 这个函数
仔细思考后可以发现:
(F(x,y,t)=sum_{d=1}^x d^2 (sum_{a=1}^{lfloorfrac{x}{d} floor} a sum_{b=1}^{lfloorfrac{y}{d} floor} b))
设 (sum(x,y)=sum_{a=1}^x sum_{b=1}^y ab)
显然可以用高斯求和 (O(1)) 求得
( herefore F(x,y,t)=sum_{d=1}^x d^2 sum(lfloorfrac{x}{d} floor,lfloorfrac{y}{d} floor))
那么整个分析过程就差不多完成了,综上所述:
(ans=sum_{d=1}^n d f(lfloorfrac{n}{d}
floor,lfloorfrac{m}{d}
floor,1))
我们可以分块处理 (f) ,此处可以分块 复杂度(O(sqrt{n}))
(f(x,y,1)=sum_{t=1}^x mu(t) F(x,y,t)=sum_{t=1}^x mu(t) t^2 sum(lfloorfrac{x}{t}
floor,lfloorfrac{y}{t}
floor))
我们可以 (O(1)) 预处理 (mu(t) t^2),计算 (sum)
所以总复杂度 (O(nsqrt{n}))