【bzoj2820】【YY的gcd】【莫比乌斯反演】

2024-02-20 15:38

本文主要是介绍【bzoj2820】【YY的gcd】【莫比乌斯反演】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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
题解:
设p为质数,暴力搞的话显然是

pd=1npnpdmpdu(d)

设T=pd,稍微化一下可以变成
T=1nnTmTp|Tu(Tp)

设g[t]= p|Tu(Tp)
考虑只要求出g数组就可以 n 处理询问了。
g数组可以枚举每个质数然后更新它的倍数.
可以证明这样处理是O(n)的。

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10000010
using namespace std;
int u[N],p[N],n,m,t,pos;
long long g[N],ans;
bool f[N];
void pre(){u[1]=1;for (int i=2;i<=N-10;i++){if (!f[i]){p[++p[0]]=i;u[i]=-1;}for (int j=1;j<=p[0]&&i*p[j]<=N-10;j++){f[i*p[j]]=1;if (i%p[j]==0){u[i*p[j]]=0;break;}u[i*p[j]]=-u[i];}}for (int i=1;i<=p[0];i++)for (int j=1;j<=(N-10)/p[i];j++)g[p[i]*j]+=(long long)u[j];for (int i=1;i<=N-10;i++) g[i]+=g[i-1];
}
int main(){ scanf("%d",&t);pre();while (t--){scanf("%d%d",&n,&m);ans=0;if (n>m) swap(n,m);for (int i=1;i<=n;i=pos+1){pos=min(n/(n/i),m/(m/i));ans+=(long long)(n/i)*(long long)(m/i)*(g[pos]-g[i-1]); }printf("%lld\n",ans);}
}

这篇关于【bzoj2820】【YY的gcd】【莫比乌斯反演】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

GCD LCM

GCD(最大公约数) 欧几里得算法(辗转相除法) 原理 if(a%b==0) GCD=b else GCD=b%(a%b) 设 a ≥ b a\ge b a≥b: 若 a m o d b = = 0 a\mod b==0 amodb==0,则 g c d ( a , b ) = = b gcd(a,b)==b gcd(a,b)==b(整除性质); 若 a m o d b ! = 0 a

Python星载气溶胶数据处理与反演分析

在当前全球气候变化和环境污染问题日益突出的背景下,气溶胶研究显得尤为重要。气溶胶在大气中由直径范围在0.01微米至10微米固体和液体颗粒构成,直接或间接影响地球辐射平衡、气候变化和空气质量。尤其在“碳中和”目标的驱动下,研究气溶胶对“碳中和”的气候影响及其环境效应,不仅对科学研究具有重大意义,同时也为政策制定提供了重要依据。 MODIS(中分辨率成像光谱仪)和CALIOP(云-气溶胶偏振激光雷达

[SCU 4519] 来签个到吧 (GCD + 期望)

SCU - 4519 盒子里有若干个球,每个球上面都有一个数字,数字各不相同 每次从中选两个数字 x,y,设 z= |x−y| | x - y | 若 z不在盒子中,则加入这个数 反复执行操作,直到无法再向盒子里加数 随机从盒子中摸出一个球,反复执行这个操作直到所有球都被摸出来过 问最后的期望步数 第一部分的构造: 设所有数的最大公因数是D 则所有数可以表示为 x=k

Swift3.0 GCD多线程示例

///func mainThread(){// 开一条全局队列异步执行任务DispatchQueue.global().async {/* Group的用法* 1. notify(依赖任务), 必须和 enter/leave在同一队列才会执行* 2. wait(任务等待)* 3. enter/leave 手动管理group计数,enter和leave必须配对, 可以不需要wait()*/

GCD简析(同步、异步、串行、并行)

/* * *需求规定:四个耗时任务A、B、C、D,要求先执行A,A执行完毕后才能开始B和C,但是B和C没有先后顺序,即并发执行,但是必须B和C都结束以后才能执行D。 *因为四个任务都是耗时任务,所以必须放入子线程中才行,否则会导致线程阻塞,又B和C并发执行,所以B和C是异步并发执行的任务。下面是具体代码。 */ //对任务A创建一个SERIAL队列,即同时只执行一个任务dispatch

iOS与OS多线程和内存管理----GCD底层实现

GCD实现 GCD实在内核XNU上实现的,实现Dispatch Queue的软件组建: libdispatch组件,主要提供Dispatch Queue技术; Libc(pthreads)组件,主要提供prhread_workqueue技术; XNU内核,主要提供workqueue技术。 我们使用的GCD的API是C语言函数,全部包含在LIBdispatch库中,Dispatch Que

iOS与OS多线程和内存管理---GCD的API详解

本文是学习《Objective-C高级编程:iOS与OS多线程和内存管理》的总结,详细的介绍了dispatch_queue_creat、Main Dispatch Queue/Global Dispatch Queue、dispatch_set_target_queue、dispatch_after、Dispatch Group、dispatch_apply、dispatch–sync(async

gcd简单应用

相等的最小公倍数 Time Limit: 1000 MSMemory Limit: 65536 K Total Submit: 145(55 users)Total Accepted: 63(44 users)Rating: Special Judge: No Description 定义An为1,2,…,n的最小公倍数,例如,A1 = 1,A2 = 2,A3 = 6,A4 = 12,A

ZOJ 3804 YY's Minions

ZOJ 3804 YY's Minions 简单的模拟题  初始时  每个点都有两种状态 0 1  然后判断每个点周围八个方向中相邻点的状态  判断状态为1的个数 注意点状态变为X是在每秒钟的末尾 所以要在每秒钟的末尾对状态进行改变 用两个数组对前一秒的状态跟这一秒的状态分别进行存储 #include <cstdio>#include <iostream>#include <cs

NYOJ-655-光棍的yy-2013年08月21日16:50:16

光棍的yy 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2 描述 yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊。 现在给你m个1,你可以把2个1组合成一个2,这样就不是光棍了,问这样的组合有多少种?? 例如(111  可以拆分为 111 12 21  有三种) 输入 第一行输入一个n表示有n个测