ARC159B GCD Subtraction

2024-01-31 16:44
文章标签 gcd subtraction arc159b

本文主要是介绍ARC159B GCD Subtraction,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


这里有一个性质,对于互质的两个数 a , b a,b a,b,它们的答案与 a g , b g ag,bg ag,bg 两数的答案相等。设 a g , b g ag,bg ag,bg i i i 操作减去的数 x x x a , b a,b a,b i i i 次操作减去的数为 y y y,显然有 x = g y x=gy x=gy,前者减去的数是后者的 g g g 倍,而 a g , b g ag,bg ag,bg 又恰好是 a , b a,b a,b g g g 倍,得证。

所以我们可以先把 a , b a,b a,b 除以其最大公约数,变成互质的 a , b a,b a,b。此时最大公约数是 1 1 1,如果后面的最大公约数一直是 1 1 1,直接模拟必然超时。

对于特殊情况:如果 a = b a=b a=b,步数为 1 1 1;如果 a , b a,b a,b 有一者为 1 1 1,步数为 1 1 1;如果 ∣ a − b ∣ = 1 |a-b|=1 ab=1,步数为 min ⁡ ( a , b ) \min(a,b) min(a,b)

考虑一般情况:快速求出最小的 k k k,存在大于 1 1 1 的数 p p p 满足 gcd ⁡ ( a − k , b − k ) = p \gcd(a-k,b-k)=p gcd(ak,bk)=p。显然限定 p p p 为质数不会增大 k k k。枚举 1 0 6 10^6 106 以内的质数求出最小的 k k k(注意 k < min ⁡ ( a , b ) k<\min(a,b) k<min(a,b) 等细节),然后重复上面的流程即可。

分析时间复杂度:设 N = max ⁡ ( A , B ) N=\max(A,B) N=max(A,B)求最小的 k k k O ( N ln ⁡ N ) O(\frac{\sqrt N}{\ln N}) O(lnNN ) 的,每次 a , b a,b a,b 都要除以最大公约数,因此会有 O ( log ⁡ 2 N ) O(\log_2 N) O(log2N) 次流程,预处理质数 O ( N ) O(\sqrt N) O(N ),总的时间复杂度为 O ( N ) O(\sqrt N) O(N )

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+1;
ll n,m,ans;
int a[N],p[N],cnt;
ll gcd(ll a,ll b)
{return !b?a:gcd(b,a%b);
}
int main()
{a[1]=1;for(int i=2;i<N;i++){if(!a[i]) p[++cnt]=i;for(int j=1;j<=cnt&&i*p[j]<N;j++){a[i*p[j]]=1;if(i%p[j]==0) break;}}cin>>n>>m;while(n&&m){if(n>m) swap(n,m);ll g=gcd(n,m);n/=g,m/=g;if(abs(n-m)<=1) cout<<ans+min(n,m),exit(0);ll k=1e12,P=0;for(int i=1;i<=cnt&&p[i]<=n;i++) if(p[i]<=n&&n%p[i]==m%p[i]) k=min(k,n%p[i]);if(k==1e12){ll x=abs(n-m);if(x<=n&&n%x==m%x) k=n%x;else k=n;}ans+=k;n-=k,m-=k;}cout<<ans;
}

这篇关于ARC159B GCD Subtraction的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

每日一题~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中

环上k划分的和的gcd的最大值【gcd基本性质的利用】

今早看到的题,想了下会做了,但是觉得这题挺有意思的,于是打算写一下做法。本题利用了gcd的基本性质:更相减损法以及结合律,平时做gcd的题基本没用到过这两性质,而本题对这性质进行了充分利用。 思路: 首先我们考虑给一个序列,我们该怎么做。 令 fn=∑ni=1ai f_n=\sum_{i=1}^n a_i。 我们考虑序列的一个 k+1 k+1划分 fx1,fx2−fx1,fx3−fx2

猫猫学iOS(五十一)多线程网络之GCD下载合并图片_队列组的使用

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片、LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载dispatch_async(dis

猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方

iOS面试:GCD的队列(dispatch_queue_t)分哪两种类型?

在 iOS 开发中,Grand Central Dispatch (GCD) 提供了强大的并发执行任务的能力。dispatch_queue_t 是 GCD 中的一个重要对象,用于管理和调度要执行的任务。GCD 的队列主要可以分为两种类型: 1. 串行队列(Serial Queues) 串行队列确保在同一时间只执行一个任务。任务按照它们被添加的顺序逐个执行。这种队列适用于需要操作共享资源的场景,

GCD部分用法

1,用gcd延迟执行任务 如果我们需要某个方法在一段时间后执行,那么我们常常会调用这样的方法 - (void)viewDidLoad{     [super viewDidLoad];     [self performSelector:@selector(printString:) withObject:@"Grand Central Dispatch" afterDel

学习GCD的一些基本用法

1.使用dispatch_get_global_queue创建一个并行队列,系统默认给我们提供了四种优先级的global Queue,每一个Queue都是一个单例 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_get_global_queue创建并

Codeforces Round #328 (Div. 2)C. The Big Race(数学gcd lcm)

题目连接 题意:比赛时 ,居然理解错题意= =,以为两个人的速度是一样的,然后有个人的只会有一步是w米,另一个人只有一步是b米。。。。 就是一个人每一步是w,一个人每一步是b,终点后是深渊,然后长度是在1–t随机选择一个d作为赛道长度,问不能区分二人胜负的可能。 思路:就是求d%w==d%b = = #include<bits/stdc++.h>using namespace std;