Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

2023-12-25 15:58

本文主要是介绍Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2820: YY的GCD
Time Limit: 10 Sec Memory Limit: 512 MB
Description
神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种
傻×必然不会了,于是向你来请教……多组输入
Input
第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M
Output
T行,每行一个整数表示第i组数据的结果
Sample Input
2
10 10
100 100
Sample Output
30
2791
HINT
T = 10000
N, M <= 10000000

大佬的题解 还是弱啊orz

/*
莫比乌斯.
最后用除法分块..
筛莫比乌斯函数部分:
显然每个素数直接计算mu[i]=-1.
我们知道莫比乌斯函数值是(-1)^k,k是互异质数的个数.
对于一个合数x,令它质因子的最小的那个为p1,
则有x=p1*t1,另设一个与异于p1的质因子为p2.
则有p1*t1=p2*t2.
因为p1与p2互素,所以p2|t1,p1|t2.
所以当i枚举到t2时,因为p1|t2,所以退出
**有一个疑问:就是如果有一个数x1>x,那直接退出以后是不是会影响x1函数值的计算???数学不好没证出来orz**
假如有一个x1=t1*p,且p是x1最大的质因数.
当i枚举到t1时,计算一下x的函数值.
所以我们保证算的每一个合数的莫比乌斯函数的时候
都是在最后一个计算素数的时候的
即每个函数值都只计算了一次.
复杂度是O(n)哒.
*/
#include<iostream>
#include<cstdio>
#define MAXN 10000001
#define LL long long
using namespace std;
int mu[MAXN],pri[MAXN],tot,g[MAXN],sum[MAXN],last;
LL ans,n,m;
bool vis[MAXN];
void pre()
{mu[1]=1;for(int i=2;i<=MAXN-1;i++){if(!vis[i]) pri[++tot]=i,mu[i]=-1,g[i]=1;for(int j=1;j<=tot&&i*pri[j]<=MAXN-1;j++){vis[i*pri[j]]=true;if(i%pri[j]) mu[i*pri[j]]=-mu[i],g[i*pri[j]]=mu[i]-g[i];else {mu[i*pri[j]]=0;g[i*pri[j]]=mu[i];break;}}}for(int i=1;i<=MAXN-1;i++) sum[i]=sum[i-1]+g[i];}
int main()
{int t,x,y;pre();scanf("%d",&t);while(t--){scanf("%lld%lld",&n,&m);if(n>m) swap(n,m);ans=0;for(LL i=1;i<=n;i=last+1){last=min(n/(n/i),m/(m/i));ans+=(n/i)*(m/i)*(sum[last]-sum[i-1]);}printf("%lld\n",ans);}return 0;
}

这篇关于Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536077

相关文章

hdu6053 TrickGCD 莫比乌斯反演

TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description You are given an array  A  , and Zhu wants to know there are how many d

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

iOS——GCD再学习

GCD 使用GCD好处,具体如下: GCD 可用于多核的并行运算;GCD 会自动利用更多的 CPU 内核(比如双核、四核);GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码。 任务与队列 概念 **任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。**在 GCD 中是放在 block 中

GCD常用函数拾遗

目录 dispatch_block_t监听block执行结束dispatch_block_waitdispatch_block_notify 撤销block总结参考 这几天偶尔又回顾了下GCD的知识。之前我一直以为自己对于GCD已经大体有个整体掌握了,却发现仍还有一些知识点的遗漏。于是写在这里,算是对之前GCD常用函数文章的补充。 dispatch_block_t 在GCD中

Spring Boot实现大文件分块上传

1.分块上传使用场景 大文件加速上传:当文件大小超过100MB时,使用分片上传可实现并行上传多个Part以加快上传速度。 网络环境较差:网络环境较差时,建议使用分片上传。当出现上传失败的时候,您仅需重传失败的Part。 文件大小不确定: 可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。 2.实现原理 实现原理其实很简单,核心就是客户端把大文件

信息学奥赛初赛天天练-83-NOIP2014普及组-基础题2-输入设备、输出设备、操作系统、二进制、整数除法、while、do while循环

1 NOIP 2014 普及组 基础题2 4 以下哪一种设备属于输出设备( ) A 扫描仪 B 键盘 C 鼠标 D 打印机 5 下列对操作系统功能的描述最为完整的是( ) A 负责外设与主机之间的信息交换 B 负责诊断机器的故障 C 控制和管理计算机系统的各种硬件和软件资源的使用 D 将没有程序编译成目标程序 11 下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( ) A 296

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo