显然题目所求为 n∑i=1m∑j=1[σ(gcd(i,j))≤a]σ(gcd(i,j))。
先不考虑 a 的限制,推一推式子。
n∑i=1m∑j=1σ(gcd(i,j))=min(n,m)∑i=1σ(i)n∑x=1m∑y=1[gcd(x,y)=i]=min(n,m)∑i=1σ(i)∑d|iμ(id)⌊nd⌋⌊md⌋=min(n,m)∑i=1⌊ni⌋⌊mi⌋∑d|iσ(d)μ(id)
现在我们来考虑 a 的限制。
设 sum(i)=∑d|iσ(d)μ(id),那么显然对于任意的 σ(i)≤a,它只会对满足 i|d 的 sum(d) 有贡献。
于是可以把 σ(i) 排序,并把询问离线按 a 排序,然后随着 a 的增大,不可能会有 σ(i) 的贡献消失,只可能会增加,所以枚举倍数并更新贡献即可。
这样的话,增加贡献的次数是 O(n∑i=1ni)≈O(nlogn)。
接着考虑如何维护贡献。
由于要单点修改并且区间查询,必须在线,常数要求较高,当然首选 BIT。
此外,因为模数很特殊,所以自然溢出并在最后按位与 231−1 即可。
好奇为什么约数和这种东西都要线性筛(
反正 O(nlogn) 随便跑,懒得推了。
代码:
1 |
|