题意

\(T(T \le 10000)\)次询问,每次给出\(a, b(1 \le a, b \le 10^7)\),求

\[\sum_{i=1}^{a} \sum_{j=1}^{b} f((i, j))
\]

其中\(f(n)\)表示\(n\)所含质因子的最大幂指数。\(f(1)=0\)。

分析

以下默认\(a \le b\)

$$
\begin{align}
& \sum_{i=1}^{a} \sum_{j=1}^{b} f((i, j)) \\
= & \sum_{d=1}^{a} f(d) \sum_{i=1}^{a'} \sum_{j=1}^{b'} [(i, j)=1] & \left( a' = \left \lfloor \frac{a}{d} \right \rfloor, b' = \left \lfloor \frac{b}{d} \right \rfloor \right) \\
= & \sum_{d=1}^{a} f(d) \sum_{i=1}^{a'} \sum_{j=1}^{b'} \sum_{k|(i, j)} \mu(k) \\
= & \sum_{d=1}^{a} f(d) \sum_{k=1}^{\left \lfloor \frac{a}{d} \right \rfloor} \mu(k) \left \lfloor \frac{a}{kd} \right \rfloor \left \lfloor \frac{b}{kd} \right \rfloor \\
= & \sum_{T=1}^{a} \left \lfloor \frac{a}{T} \right \rfloor \left \lfloor \frac{b}{T} \right \rfloor \sum_{d|T} \mu(d) f(\frac{T}{d}) \\
\end{align}
$$

考虑\(g(n) = \sum_{i|n} \mu(i) f(\frac{n}{i})\):

令\(S = \\{ p_i \\}\),\(p_i\)为\(n\)的质因子,则只有当\(i=\prod_{j \in S' \subseteq S} j\)时才对\(g(n)\)有贡献。

令\(A \subseteq S\)表示指数最大(假设为\(y\))的质因子集合,\(B=S-A\)。则\(i\)可以看做从\(A\)中选出一些质因子再从\(B\)中选出一些质因子组合一下。

由于\(f(\frac{n}{i})\)的取值只取决于\(i\)中从\(A\)集合取的子集(可以发现\(f\)要么是\(a\),要么是\(a-1\),由\(A\)来决定的),所以我们只需考虑\(A\)的子集。

当\(B \neq \varnothing\)时,当选的\(A\)的子集确定后即\(f(\frac{n}{i})\)相同时,由于从\(B\)中奇偶大小子集的个数相同,因此奇数个质因子的\(i\)和偶数个质因子的\(i\)的个数相同,所以\(\mu(i)\)的和为\(0\)。所以\(g(n)=0\)。

当\(B = \varnothing\)时,则只有当\(i=\prod_{j \in S} j\)时\(f(\frac{n}{i})=y-1\),否则\(f(\frac{n}{i})=y\)。而当\(f(\frac{n}{i})=y\)时,对于这个非全集的所有子集,奇数大小的子集和偶数大小的子集个数相差为1,计算一下就知道这种情况的贡献是\((-1)^{|S|+1} a\)。对于全集,贡献是\((-1)^{|S|} (a-1)\)。所以\(g(n) = (-1)^{|S|} (a-1) + (-1)^{|S|+1} a = (-1)^{|S|+1}\)

于是线性筛筛出\(g(n)\)即可。

题解

至于查询,分块就行了。

复杂度\(O(b+Tb^{0.5})\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Lim=10000005;
int N, x[10005], y[10005], f[Lim], p[Lim], mu[Lim], cnt;
bool np[Lim];
ll sum[Lim];
void init() {
mu[1]=1;
for(int i=2; i<=N; ++i) {
if(!np[i]) p[cnt++]=i, mu[i]=-1;
for(int j=0; j<cnt; ++j) {
int t=p[j]*i; if(t>N) break;
np[t]=1;
if(i%p[j]==0) break;
mu[t]=-mu[i];
}
}
for(int i=2; i<=N; ++i) {
if(mu[i]) {
sum[i]=-mu[i];
}
}
for(int i=N; i>=2; --i) {
if(sum[i]) {
for(ll j=(ll)i*i; j<=N; j*=i) {
sum[j]=sum[i];
}
}
}
for(int i=2; i<=N; ++i) {
sum[i]+=sum[i-1];
}
}
int main() {
int T; scanf("%d", &T);
for(int i=1; i<=T; ++i) scanf("%d%d", &x[i], &y[i]), N=max(N, x[i]), N=max(N, y[i]);
init();
for(int tt=1; tt<=T; ++tt) {
int a=x[tt], b=y[tt];
if(a>b) swap(a, b);
int now=1;
ll ans=0;
for(int i=1; i<=a; i=now+1) {
now=min(a/(a/i), b/(b/i));
ans+=(ll)(a/i)*(ll)(b/i)*(sum[now]-sum[i-1]);
}
printf("%lld\n", ans);
}
return 0;
}

【BZOJ】3309: DZY Loves Math的更多相关文章

  1. 【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

    3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007) ...

  2. 【BZOJ】3561: DZY Loves Math VI

    题意 求\(\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j)^{gcd(i, j)}\)(\(n, m<=500000\)) 分析 很显然要死推莫比乌斯 题解 设\ ...

  3. 【BZOJ】3542: DZY Loves March

    题意 \(m * m\)的网格,有\(n\)个点.\(t\)个询问:操作一:第\(x\)个点向四个方向移动了\(d\)个单位.操作二:询问同行同列其他点到这个点的曼哈顿距离和.强制在线.(\(n \l ...

  4. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  5. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

  6. 【BZOJ 3561】 3561: DZY Loves Math VI (莫比乌斯,均摊log)

    3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 205  Solved: 141 Description ...

  7. 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)

    3560: DZY Loves Math V Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 241  Solved: 133 Description ...

  8. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

  9. bzoj 3309 DZY Loves Math——反演+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...

随机推荐

  1. java 获取文件列表,并按照文件名称排序

    需求:获取全部的日志文件,并按照文件名称倒序排列,把最新的文件放在最前1.获取全部的日志文件:(方法:public List<String> ergodic(File file,List& ...

  2. Canvas实例

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. XMPP作为一个工具的意义

    学习XMPP就是拥有位当前应用程序添加实时,推送,社交功能所需的工具.虽然浏览器不支持XMPP通讯,但是我们可以通过BOSH技术解决. 一个XMPP网络包含如下 服务器:为XMPP节提供路由,是否支持 ...

  4. [Data Structure & Algorithm] 七大查找算法

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...

  5. Javascript中闭包问题(转载)

    学习Javascript闭包(Closure)   作者: 阮一峰 日期: 2009年8月30日 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现 ...

  6. C/C++ 的使用

    C++    http://www.cplusplus.com/ http://www.cplusplus.me/ *****************容器container vector 转自 htt ...

  7. linux常用命令-文件搜索命令-locate,which,whereis,grep

    locate 目录或文件名 -i 查找的时候不区分大小写 这个类似everything,速度比find快很多,因为这个命令搜索的是它维护的文件资料库,文件资料库是var/lib/mlocate/mlo ...

  8. 【转】python编码的问题

    摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...

  9. haproxy测试

    环境: Clients:N台linux, 使用“ab -k -c 20000...” 并发2w 请求haproxy Haproxy Server: R610 2*8核 2.4G Real Server ...

  10. CPU时间片

    CPU时间片 为了提高程序执行效率,大家在很多应用中都采用了多线程模式,这样可以将原来的序列化执行变为并行执行,任务的分解以及并行执行能够极大地提高程序的运行效率. 但这都是代码级别的表现,而硬件是如 ...