P2841【SDOI2014 R1D1】数表
问题描述
有一张n*m的数表,其第i行第j列(1<=i<=n,1<=j<=m)的数值为能同时整除i和j的所有自然数之和。给定a,计算数表中不大于a的数之和。
输入格式
输入包含多组数据。
输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a描述一组数据。
输出格式
对每组数据,输出一行一个整数,表示答案模2^31的值。
样例输入
2
4 4 3
10 10 5
样例输出
20
148
提示
对于30%的数据,1<=n,m<=400,1<=Q<=200
对于另外30%的数据,1<=n,m<=10^5,1<=Q<=10
对于100%的数据,1<=n,m<=10^5,1<=Q<=20000,0<=a<=10^9
容易得到对于单次询问
$$
Ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\sigma(gcd(i,j)),[\sigma(gcd(i,j))<=a]
$$
那么,推导一番
$$
Ans=\sum_{d=1}^{N}\sigma(d)\sum_{i=1}^{n}\sum_{j=1}^{m}1[gcd(i,j)=d],N=min(n,m)
$$
然后,反演一下
$$
Ans=\sum_{d=1}^{N}\sigma(d)\sum_{d|K}^{N}\mu(\frac{K}{d})\lfloor{\frac{n}{K}}\rfloor\lfloor{\frac{m}{K}}\rfloor=\sum_{K=1}^{N}\lfloor{\frac{n}{K}}\rfloor\lfloor{\frac{m}{K}}\rfloor\sum_{d|K}\sigma(d)\mu(\frac{K}{d}),\sigma(d)<=a
$$
注意到$\sum_{d|K}\sigma(d)\mu(\frac{K}{d})$是个积性函数,用线性筛预处理,但是只有$\sigma(d)<=a$的项才对答案有贡献,因此离线处理,对询问按照a排序,然后每次将小于等于a的那些项暴力枚举一下倍数,更新到树状数组里面,查询的时候直接用。
复杂度为$O(n\ ln\ n+m\sqrt{n}log_2n)$左右
代码:
1 |
|