Mophues

\[Time Limit: 10000 ms\quad Memory Limit: 262144 kB
\]

题意

求出满足 \(gcd\left(a,b\right) = k\),其中\(1\leq a\leq n,1\leq b \leq m\)且 \(k\) 的因子数 \(\leq P\)

思路

\(g\left(x\right)\) 表示 \(gcd\left(a, b\right) | x\) 的对数

\(f\left(x\right)\) 表示 \(gcd\left(a, b\right) = x\) 的对数

根据莫比乌斯反演有

\[ f\left(n\right) = \sum_{n|d} g\left(d\right)\\
g\left(n\right) = \sum_{n|d} \mu\left(\frac{d}{n}\right) f\left(d\right) \\
\]

根据题意

\[ f\left(x\right) = \lfloor\frac{n}{x}\rfloor \lfloor\frac{m}{x}\rfloor \\
\]

那么可以得到

\[\begin{aligned}
ans &= \sum_{k\in 条件} \sum_{k|d} \mu\left(\frac{d}{k}\right) \lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\\
&= \sum_{d}\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \sum_{k|d}\mu\left(\frac{d}{k}\right) \left(k \in 条件\right)
\end{aligned}
\]

因 \(n \leq 10^{5}\),其中最多的因子数不会超过 \(19\)。

令 \(c[d][p]\) 表示 \(\sum_{k|d}\mu\left(\frac{d}{k}\right)\),其中 \(k\) 的因子数\(\leq p\)。通过 \(nlogn\) 暴力打表出 \(p<=19\) 的情况,当 \(p>19\) 时,所有的对数都满足条件。

由于 \(\lfloor\frac{n}{d}\rfloor \lfloor\frac{m}{d}\rfloor\) 的存在,需要整除分块,所以对于求出来的 \(c[d][p]\) 还需要统计前缀和。

/***************************************************************
> File Name : a.cpp
> Author : Jiaaaaaaaqi
> Created Time : 2019年07月17日 星期三 14时38分33秒
***************************************************************/ #include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 5e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m, P;
int cas, tol, T; int pri[maxn], mob[maxn], cnt[maxn];
ll c[maxn][20];
bool ispri[maxn]; void handle() {
mes(pri, 0), mes(ispri, 1);
tol = 0;
int mx = 5e5;
mob[1] = 1;
cnt[1] = 0;
for(int i=2; i<=mx; i++) {
if(ispri[i]) {
pri[++tol] = i;
mob[i] = -1;
cnt[i] = 1;
}
for(int j=1; j<=tol&&i*pri[j]<=mx; j++) {
ispri[i*pri[j]] = false;
cnt[i*pri[j]] = cnt[i]+1;
if(i%pri[j] == 0) {
mob[i*pri[j]] = 0;
break;
} else {
mob[i*pri[j]] = -mob[i];
}
}
}
mes(c, 0);
for(int i=1; i<=mx; i++) {
for(int j=i; j<=mx; j+=i) {
c[j][cnt[i]] += mob[j/i];
}
}
for(int i=1; i<=mx; i++) {
for(int j=1; j<=19; j++) {
c[i][j] += c[i][j-1];
}
}
for(int i=1; i<=mx; i++) {
for(int j=0; j<=19; j++) {
c[i][j] += c[i-1][j];
}
}
} int main() {
handle();
scanf("%d", &T);
while(T--) {
scanf("%d%d%d", &n, &m, &P);
if(n > m) swap(n, m);
if(P > 19) {
printf("%lld\n", 1ll*n*m);
continue;
}
ll ans = 0;
int l = 0, r;
for(int i=1; i<=n; i++) {
r = min(n/(n/i), m/(m/i));
ans += 1ll*(n/i)*(m/i)*(c[r][P]-c[l][P]);
i = r;
l = r;
}
printf("%lld\n", ans);
}
return 0;
}

Mophues HDU - 4746 (莫比乌斯反演)的更多相关文章

  1. HDU 4746 (莫比乌斯反演) Mophues

    这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<= ...

  2. HDU 4746 莫比乌斯反演+离线查询+树状数组

    题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...

  3. HDU 1695 (莫比乌斯反演) GCD

    题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是 ...

  4. GCD HDU - 1695 莫比乌斯反演入门

    题目链接:https://cn.vjudge.net/problem/HDU-1695#author=541607120101 感觉讲的很好的一个博客:https://www.cnblogs.com/ ...

  5. HDU 5212 莫比乌斯反演

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  6. hdu 1695(莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU 6053(莫比乌斯反演)

    题意略. 思路:首先想到暴力去扫,这样的复杂度是n * min(ai),对于gcd = p,对答案的贡献应该是 (a1 / p) * (a2 / p) * .... * (an / p),得出这个贡献 ...

  8. hdu 4746Mophues[莫比乌斯反演]

    Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others) Total ...

  9. hud 4746 莫比乌斯反演

    Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others)Total S ...

随机推荐

  1. AQS工作原理分析

      AQS工作原理分析 一.大致介绍1.前面章节讲解了一下CAS,简单讲就是cmpxchg+lock的原子操作:2.而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sy ...

  2. Java多线程编程(2)--多线程编程中的挑战

    一.串行.并发和并行   为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作:   第一种方式,先开始做工作A,完成之后再开始做工作B ...

  3. 【chromium】 渲染显示相关概念

    DRM(Direct Rendering Manager) DRM 由两个部分组成:一是 Kernel 的子系统,这个子系统对硬件 GPU 操作进行了一层框架封装.二是提供了一个 libdrm 库,里 ...

  4. Java学习:线程实现方式

    线程实现方式 并发与并行 并发:指两或多个事件在同一个时间段内发生 并行:指两或多个事件在同一个时刻发生(同时发生) 进程的概念 内存:所有的应用程序都需要进入到内存中执行 临时存储RAM 硬盘:永久 ...

  5. ES7.3.0配置邮件告警

    情况说明: 三台es组成集群,一台kibana,版本均为7.3.0 es版本要求是白金版,基础版的不行,不过可以试用30天的白金版 步骤:先说我自己走通的流程,然后介绍官方说明 1.因为我这边使用的是 ...

  6. SQL Server中COALESCE函数的用法

    在SQL Server中COALESCE函数,会返回其参数中第一个不为NULL的参数,效果如下: SELECT COALESCE(NULL,NULL,N'A',NULL,NULL) 结果: SELEC ...

  7. Vert.x Web

    https://vertx.io/docs/vertx-web/java/ Vert.x-Web是一组用于使用Vert.x构建Web应用程序的构建块.将其视为瑞士军刀,用于构建现代,可扩展的网络应用程 ...

  8. xshell连接本地linux虚拟机速度很慢的解决办法

    今天发现用xshell连接centos太慢,网上查询后发现是因为ssh的服务端在连接时会自动检测dns环境是否一致导致的,修改为不检测即可. 修改文件位置:vi /etc/ssh/sshd_confi ...

  9. Python语言控制运算的优先级

    Python语言碰上计算式同时出现在一个指令内时,除了括号"(".")"最优外,其余计算优先次序如下: 次方(**). 乘法.除法.求余数(%).求整数(//) ...

  10. 2019-08-02 原生ajax搜索

    <html> <meta charset="utf-8"/> <head><title>搜索页</title></ ...