学了莫比乌斯反演之后对初阶问题没有任何问题了,除法分块也码到飞起,但是稍微变形我就跪了。用瞪眼观察法观察别人题解观察到主要内容除了柿子变形之外,主要就是对于miu函数的操作求前缀和。进而了解miu函数,miu函数是在这个数是否有平方因子的个数,每次推的套路是先用欧拉筛筛出来所有需要的函数,然后用每次需要用到的函数进行累计迭代加到前缀和,二次过筛,然后堆起来前缀和,用除法分块就行了,这个方法屡试不爽。

两道题,一道是洛谷P2257 YY的GCD

这道题求的是1-n和1-m区间内gcd为质数的个数,对此我们有暴力O(nmtlogn)算法,用莫比乌斯反演之后,我们枚举质数,每次来一遍分块,可以降到O(t * sqrtn + n),显然对于1e7这种级别的,质数都有66w个,复杂度显而易见是不够优秀的,那么我们需要一些加速,就是用前缀和处理出来这个区间内有质数gcd的数目,然后跑分块就可行了,复杂度根号

#include <bits/stdc++.h>
using namespace std;
#define limit (10000000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define FASTIO ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(ll i = a; i <= b ; ++i)
#define per(i, a, b) for(ll i = b ; i >= a ; --i)
#define MOD 998244353
#define traverse(u) for(int i = head[u]; ~i ; i = edge[i].next)
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
#define FOUT freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\dabiao.txt", "wt", stdout)
#define debug(x) cout<<x<<endl
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){
ll sign = 1, x = 0;char s = getchar();
while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
while(s >= '0' && s <= '9'){x = (x << 3) + (x << 1) + s - '0';s = getchar();}
return x * sign;
}//快读
void write(ll x){
if(x < 0) putchar('-'),x = -x;
if(x / 10) write(x / 10);
putchar(x % 10 + '0');
}
int prime[limit],tot,num[limit],miu[limit];
ll sum[limit];
void get_prime(const int &n = 1e7){
memset(num,1,sizeof(num));
num[1] = num[0] = 0;
miu[1] = 1;
rep(i,2,n){
if(num[i])prime[++tot] = i,miu[i] = -1;
for(int j = 1; j <= tot && prime[j] * i <= n ; ++j){
num[prime[j] * i] = 0;
if(i % prime[j] == 0){
miu[i * prime[j]] = 0;
break;
}else{
miu[i * prime[j]] = -miu[i];//莫比乌斯函数
}
}
}
rep(i ,1,tot){
for(int j = prime[i] ; j <= n ; j += prime[i]){
sum[j] += miu[j / prime[i]];//几个平方因子
}
}
rep(i ,1,n){
sum[i] += sum[i-1];
} }//素数筛
ll n,m;
const ll d = 1;
ll calc(){
ll ans = 0;
for(int l = 1,r ; l <= min(n/d,m/d); l = r + 1){
//值域分块
ll t = n / d , s = m / d;
r = min(t / (t / l), s / (s / l));
ans += (sum[r] - sum[l - 1]) * (t / l) * (s / l);
} return ans;
}
int main() {
#ifdef LOCAL
FOPEN;
#endif
get_prime(10000000);
int kase = read();
while (kase--){
n = read(), m = read();
write(calc()),putchar('\n');
}
return 0;
}

AC Code

吐槽一下卡常,这卡得什么玩意儿,快读快写都上吸了氧才ac,吐了吐了

然后是HDU 5663

这题一看就特别熟悉,直接处理出是平方数的μ前缀和,然后跑一边莫比乌斯反演就行

#include <bits/stdc++.h>
using namespace std;
#define limit (10000000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define FASTIO ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(ll i = a; i <= b ; ++i)
#define per(i, a, b) for(ll i = b ; i >= a ; --i)
#define MOD 998244353
#define traverse(u) for(int i = head[u]; ~i ; i = edge[i].next)
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
#define FOUT freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\dabiao.txt", "wt", stdout)
#define debug(x) cout<<x<<endl
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){
ll sign = 1, x = 0;char s = getchar();
while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
while(s >= '0' && s <= '9'){x = (x << 3) + (x << 1) + s - '0';s = getchar();}
return x * sign;
}//快读
void write(ll x){
if(x < 0) putchar('-'),x = -x;
if(x / 10) write(x / 10);
putchar(x % 10 + '0');
}
int prime[limit],tot,num[limit],miu[limit];
ll sum[limit];
void get_prime(const int &n = 1e7){
memset(num,1,sizeof(num));
num[1] = num[0] = 0;
miu[1] = 1;
rep(i,2,n){
if(num[i])prime[++tot] = i,miu[i] = -1;
for(int j = 1; j <= tot && prime[j] * i <= n ; ++j){
num[prime[j] * i] = 0;
if(i % prime[j] == 0){
miu[i * prime[j]] = 0;
break;
}else{
miu[i * prime[j]] = -miu[i];//莫比乌斯函数
}
}
}
for(int i = 1 ; i * i <= n ; ++i){
for(int j = i * i ; j <= n ; j += i * i){
sum[j] += miu[j / i / i];//记录所有的平方
}
}
rep(i,2,n){
sum[i] += sum[i-1];
}
}//素数筛
ll n,m;
const ll d = 1;
ll calc(){
ll ans = 0;
for(int l = 1,r ; l <= min(n/d,m/d); l = r + 1){
//值域分块
ll t = n / d , s = m / d;
r = min(t / (t / l), s / (s / l));
ans += (sum[r] - sum[l - 1]) * (t / l) * (s / l);
} return ans;
}
int main() {
#ifdef LOCAL
FOPEN;
#endif
get_prime(1e7 + 1);
int kase = read();
rep(ka,1,kase){
n = read(), m = read();
printf("%lld\n",n * m - calc());
}
return 0;
}

AC Code

嘿哈

莫比乌斯反演进阶-洛谷P2257/HDU5663的更多相关文章

  1. 洛谷 P2257 YY的GCD

    洛谷 P2257 YY的GCD \(solution:\) 这道题完全跟[POI2007]ZAP-Queries (莫比乌斯反演+整除分块) 用的一个套路. 我们可以列出答案就是要我们求: \(ans ...

  2. 洛谷 P2257 - YY的GCD(莫比乌斯反演+整除分块)

    题面传送门 题意: 求满足 \(1 \leq x \leq n\),\(1 \leq y \leq m\),\(\gcd(x,y)\) 为质数的数对 \((x,y)\) 的个数. \(T\) 组询问. ...

  3. 洛谷P2257 YY的GCD 莫比乌斯反演

    原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...

  4. 洛谷P2257 YY的GCD(莫比乌斯反演)

    传送门 原来……莫比乌斯反演是这么用的啊……(虽然仍然不是很明白) 首先,题目所求如下$$\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=prim]$$ 我们设$f(d)$表示$g ...

  5. 洛谷 P2398 GCD SUM || uva11417,uva11426,uva11424,洛谷P1390,洛谷P2257,洛谷P2568

    https://www.luogu.org/problemnew/show/P2398 $原式=\sum_{k=1}^n(k\sum_{i=1}^n\sum_{j=1}^n[(i,j)=k])$ 方法 ...

  6. 洛谷 P2257 【YY的GCD】

    这道题还是和上一道[ZAP]有那么一点点的相似哈 题目大意 给定N, M,求1<=x<=N, 1<=y<=M且\(gcd(x, y)\)为质数的(x, y)有多少对 如果对莫比 ...

  7. 洛谷P2257 YY的GCD

    今日份是数论 大概是..从小学奥数到渐渐毒瘤 那就简单列一下目录[大雾 同余 质数密度 唯一分解定理 互质 完全剩余系 简化剩余系 欧拉函数 逆元 斐蜀定理 阶(及其性质) 欧拉定理 费马小定理 原根 ...

  8. 洛谷 P2257 YY的GCD 题解

    原题链接 庆祝: 数论紫题 \(T4\) 达成! 莫比乌斯 \(T1\) 达成! yy 真是个 神犇 前记 之前我觉得: 推式子,直接欧拉筛,筛出个 \(\phi\),然后乱推 \(\gcd\) 就行 ...

  9. 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...

随机推荐

  1. (2)ASP.NET Core3.1 Ocelot路由

    1.路由 前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务.Ocelot当前仅以另一个http请求的形式支持此功能( ...

  2. Serilog 源码解析——Sink 的实现

    在上一篇中,我们简单地查看了 Serilog 的整体需求和大体结构.从这一篇开始,本文开始涉及 Serilog 内的相关实现,着重解决第一个问题,即 Serilog 向哪里写入日志数据的.(系列目录) ...

  3. 1、Web应用

    一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览 ...

  4. leetcode131:letter-combinations-of-a-phone-number

    题目描述 给出一个仅包含数字的字符串,给出所有可能的字母组合. 数字到字母的映射方式如下:(就像电话上数字和字母的映射一样) Input:Digit string "23"Outp ...

  5. MYSQL学习(二) --MYSQL框架

    MYSQL架构理解 通过对MYSQL重要的几个属性的理解,建立一个基本的MYSQL的知识框架.后续再补充完善. 一.MYSQL架构 这里给的架构描述,是很宏观的架构.有助于建立对MYSQL整体理解. ...

  6. waf 引擎 云原生平台tproxy 实现调研

    了解了基本 云原生架构,不清楚的查看之前的文章:https://www.cnblogs.com/codestack/p/13914134.html 现在来看看云原生平台tproxy waf引擎串联实现 ...

  7. Linux 网络栈 转载

    此文章  来自      http://arthurchiao.art/blog/tuning-stack-rx-zh/ [译] Linux 网络栈监控和调优:接收数据(2016) Published ...

  8. shell中if/seq/for/while/until

    1.if语句格式:  if 判断条件:then statement1 statement2 fi; 例子: 判断/test/a普通文件是否存在,存在则输出yes,不存在则输出no,并创建.  #! / ...

  9. ipmi常用的命令行命令

    前言 记录一些常用的命令行操作 命令 查询机器的电源状态 ipmitool -I lanplus -U admin -P admin -H 172.16.21.215 power status 硬重启 ...

  10. webug第五关:一个优点小小的特殊的注入

    第五关:一个优点小小的特殊的注入 既然是头部注入,首先想到xff注入 出现数据库报错,而且他是直接将xff后的内容带入数据库查询