Codeforces Round #641 Orac and LCM Solution

Revision en1, by MasterChief410, 2020-05-13 11:32:19

I noticed that many people were confused by the mathematics used in the soltuion of the editorial of this Div2.C question and decided to share with you my easy method for solving it. I use the property of distributivity of the lcm fucnction over gcd to simplify the solution. For three integers $$$ a, b, c$$$ we have

  • $$$ \gcd(lcm(a, b), lcm(a, c)) = lcm(a, \gcd(b, c))$$$
  • $$$ lcm(\gcd(a, b), \gcd(a, c)) = \gcd(a, lcm(b, c)) $$$

Proof: GCD and LCM Distribute Over Each Other

Hence for an array of integers,

  • $$$ \gcd(lcm(a_0, a_1), lcm(a_0, a_2) \dots lcm(a_0, a_n)) = lcm(a_0, gcd(a_1, a_2 \dots a_n)) $$$
  • $$$ \gcd(lcm(a_1, a_2), lcm(a_1, a_3) \dots lcm(a_1, a_n)) = lcm(a_1, gcd(a_2, a_3 \dots a_n)) $$$
  • $$$\dots$$$ $$$and$$$ $$$so$$$ $$$on$$$

Therefore, for every element of the array we can precalculate the $$$\gcd$$$ of its next elements. Then we can take the lcm of that precalculated value with the element and store it in a new array. This way all possible pairs will be covered. The answer of the problem will be the $$$\gcd$$$ of these elements. Time complexity of the $$$\gcd(m, n)$$$ function is $$$\log_2v$$$ where $$$v=\max(m, n)$$$. Hence, time complexity of the solution will be $$$O(n\cdot\log_2maxval)$$$ where $$$maxval$$$ is the maximum of the array. Here is the solution:

#include <bits/stdc++.h>
using namespace std;
int lcm(int a, int b) { return (a*b)/__gcd(a, b); }

int main()
{
	int n;
	cin>>n;
	vector<int> a(n), pregcd(n);
	for(int i=0; i<n; i++)
		cin>>a[i];
	
	pregcd[n-2]=a[n-1];	
	for(int i=n-3; i>=0; i--)
		pregcd[i]=__gcd(pregcd[i+1], a[i+1]);
	
	for(int i=0; i<n; i++)
		pregcd[i]=lcm(pregcd[i], a[i]);
	
	int ans=pregcd[0];
	for(int i=1; i<n-1; i++)
		ans=__gcd(ans, pregcd[i]);
	cout<<ans<<endl;	  
}

This is my first time writing a blog so suggestions are welcome!

Tags #number theory, #tutorial, #gcd, #math

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en2 English MasterChief410 2020-05-13 13:50:12 156
en1 English MasterChief410 2020-05-13 11:32:19 1931 Initial revision (published)