Mophues HDU - 4746 (莫比乌斯反演)
Mophues
\]
题意
求出满足 \(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\) 的对数
根据莫比乌斯反演有
g\left(n\right) = \sum_{n|d} \mu\left(\frac{d}{n}\right) f\left(d\right) \\
\]
根据题意
\]
那么可以得到
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 (莫比乌斯反演)的更多相关文章
- HDU 4746 (莫比乌斯反演) Mophues
这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<= ...
- HDU 4746 莫比乌斯反演+离线查询+树状数组
题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...
- HDU 1695 (莫比乌斯反演) GCD
题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是 ...
- GCD HDU - 1695 莫比乌斯反演入门
题目链接:https://cn.vjudge.net/problem/HDU-1695#author=541607120101 感觉讲的很好的一个博客:https://www.cnblogs.com/ ...
- HDU 5212 莫比乌斯反演
Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- hdu 1695(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 6053(莫比乌斯反演)
题意略. 思路:首先想到暴力去扫,这样的复杂度是n * min(ai),对于gcd = p,对答案的贡献应该是 (a1 / p) * (a2 / p) * .... * (an / p),得出这个贡献 ...
- hdu 4746Mophues[莫比乌斯反演]
Mophues Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others) Total ...
- hud 4746 莫比乌斯反演
Mophues Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others)Total S ...
随机推荐
- 搭建zipkin并以mysql的方式存储数据
zipkin以mysql的方式存储 (centos+java8+mysql+zipkin2.3.1) 前言: 这篇教程用于搭建已mysql作为存储的zipkin.(还不知道zipkin是什么的小伙伴请 ...
- MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义
编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...
- jmeter(二十七)分布式压测注意事项
之前的博客:jemter(二十三):分布式测试简略的介绍了利用jmeter做分布式测试的方法,当时只是介绍了背景和原因,以及基本的配置操作,有同学说写得不够详细. 正好今年双十一,我司的全链路压测,也 ...
- C# 特性和索引(C#学习笔记06)
特性 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签. 特性可以当成一个特殊的类看待 列举特性语法: [attribute(pos ...
- GIt 错误与常用命令
命令和一些其他的属性等 *)在使用git commit -m “description" 这个描述会加在上次提交后所有add的文件后面,所以也可能产生不符合这个描述的文件后面也跟了这个描述, ...
- easydict的使用方法
easydict的作用:可以使得以属性的方式去访问字典的值 from easydict import EasyDict as edict a=['8',2,3]a=edict()a.f=99print ...
- 为什么要用 redis 而不用 map 做缓存?
缓存分为本地缓存和分布式缓存.以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例 ...
- Java自学-接口与继承 接口
设计Java的接口 在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击 这时候,就可以使用接口来实现这个效果. 接口就像是一种约定,我们约定某些英雄是物理系英雄,那么他们 ...
- drf--频率组件
目录 频率组件简介 自定义频率类 内置频率类及局部使用 全局使用 源码分析 SimpleRateThrottle源码分析 频率组件简介 主要是为了限制用户访问的次数,比如某一个接口(发送验证码)同一个 ...
- 女性长期没有"恩爱",会出现这4个后果?提醒:频率最好能在这个数
一直以来,很多人认为:男性性欲比女性强! 其实:因人而异! 但不管怎么说,“性”话题在如今社会中已经不再成为隐晦谈资. 越来越多的人,可以把此话题拿到桌面上各抒己见. 总归,“性”是我们探索自我的一种 ...