Given a number N. The task is to find the number of unordered coprime pairs of integers from 1 to N. There can be multiple queries.
Examples:
Input: 3 Output: 4 (1, 1), (1, 2), (1, 3), (2, 3) Input: 4 Output: 6 (1, 1), (1, 2), (1, 3), (1, 4), (2, 3), (3, 4)
Approach: Here Euler’s Totient Function will be helpful. Euler’s totient function denoted as phi(N), is an arithmetic function that counts the positive integers less than or equal to N that are relatively prime to N.
The idea is to use the following properties of Euler Totient function i.e.
- The formula basically says that the value of ?(n) is equal to n multiplied by product of (1 – 1/p) for all prime factors p of n. For example value of ?(6) = 6 * (1-1/2) * (1 – 1/3) = 2.
- For a prime number p, ?(p) is p-1. For example ?(5) is 4, ?(7) is 6 and ?(13) is 12. This is obvious, gcd of all numbers from 1 to p-1 will be 1 because p is a prime.
Now, find the sum of all phi(x) for all i between 1 to N using prefix sum method. Using this, one can answer in o(1) time.
Below is the implementation of above approach.
// C++ program to find number of unordered // coprime pairs of integers from 1 to N #include <bits/stdc++.h> using namespace std;
#define N 100005 // to store euler's totient function int phi[N];
// to store required answer int S[N];
// Computes and prints totient of all numbers // smaller than or equal to N. void computeTotient()
{ // Initialise the phi[] with 1
for ( int i = 1; i < N; i++)
phi[i] = i;
// Compute other Phi values
for ( int p = 2; p < N; p++) {
// If phi[p] is not computed already,
// then number p is prime
if (phi[p] == p) {
// Phi of a prime number p is
// always equal to p-1.
phi[p] = p - 1;
// Update phi values of all
// multiples of p
for ( int i = 2 * p; i < N; i += p) {
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
} // function to compute number coprime pairs void CoPrimes()
{ // function call to compute
// euler totient function
computeTotient();
// prefix sum of all euler totient function values
for ( int i = 1; i < N; i++)
S[i] = S[i - 1] + phi[i];
} // Driver code int main()
{ // function call
CoPrimes();
int q[] = { 3, 4 };
int n = sizeof (q) / sizeof (q[0]);
for ( int i = 0; i < n; i++)
cout << "Number of unordered coprime\n"
<< "pairs of integers from 1 to "
<< q[i] << " are " << S[q[i]] << endl;
return 0;
} |
// C program to find number of unordered // coprime pairs of integers from 1 to N #include <stdio.h> #define N 100005 // to store euler's totient function int phi[N];
// to store required answer int S[N];
// Computes and prints totient of all numbers // smaller than or equal to N. void computeTotient()
{ // Initialise the phi[] with 1
for ( int i = 1; i < N; i++)
phi[i] = i;
// Compute other Phi values
for ( int p = 2; p < N; p++) {
// If phi[p] is not computed already,
// then number p is prime
if (phi[p] == p) {
// Phi of a prime number p is
// always equal to p-1.
phi[p] = p - 1;
// Update phi values of all
// multiples of p
for ( int i = 2 * p; i < N; i += p) {
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
} // function to compute number coprime pairs void CoPrimes()
{ // function call to compute
// euler totient function
computeTotient();
// prefix sum of all euler totient function values
for ( int i = 1; i < N; i++)
S[i] = S[i - 1] + phi[i];
} // Driver code int main()
{ // function call
CoPrimes();
int q[] = { 3, 4 };
int n = sizeof (q) / sizeof (q[0]);
for ( int i = 0; i < n; i++)
printf ( "Number of unordered coprime\npairs of integers from 1 to %d are %d\n" ,q[i],S[q[i]]);
return 0;
} // This code is contributed by kothavvsaakash. |
// Java program to find number of unordered // coprime pairs of integers from 1 to N import java.util.*;
import java.lang.*;
import java.io.*;
class GFG
{ static final int N = 100005 ;
// to store euler's // totient function static int [] phi;
// to store required answer static int [] S ;
// Computes and prints totient // of all numbers smaller than // or equal to N. static void computeTotient()
{ // Initialise the phi[] with 1
for ( int i = 1 ; i < N; i++)
phi[i] = i;
// Compute other Phi values
for ( int p = 2 ; p < N; p++)
{
// If phi[p] is not computed
// already, then number p is prime
if (phi[p] == p)
{
// Phi of a prime number p
// is always equal to p-1.
phi[p] = p - 1 ;
// Update phi values of
// all multiples of p
for ( int i = 2 * p; i < N; i += p)
{
// Add contribution of p to
// its multiple i by multiplying
// with (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1 );
}
}
}
} // function to compute // number coprime pairs static void CoPrimes()
{ // function call to compute
// euler totient function
computeTotient();
// prefix sum of all euler
// totient function values
for ( int i = 1 ; i < N; i++)
S[i] = S[i - 1 ] + phi[i];
} // Driver code public static void main(String args[])
{ phi = new int [N];
S = new int [N];
// function call
CoPrimes();
int q[] = { 3 , 4 };
int n = q.length;
for ( int i = 0 ; i < n; i++)
System.out.println( "Number of unordered coprime\n" +
"pairs of integers from 1 to " +
q[i] + " are " + S[q[i]] );
} } // This code is contributed // by Subhadeep |
# Python3 program to find number # of unordered coprime pairs of # integers from 1 to N N = 100005
# to store euler's totient function phi = [ 0 ] * N
# to store required answer S = [ 0 ] * N
# Computes and prints totient of all # numbers smaller than or equal to N. def computeTotient():
# Initialise the phi[] with 1
for i in range ( 1 , N):
phi[i] = i
# Compute other Phi values
for p in range ( 2 , N) :
# If phi[p] is not computed already,
# then number p is prime
if (phi[p] = = p) :
# Phi of a prime number p
# is always equal to p-1.
phi[p] = p - 1
# Update phi values of all
# multiples of p
for i in range ( 2 * p, N, p) :
# Add contribution of p to its
# multiple i by multiplying with
# (1 - 1/p)
phi[i] = (phi[i] / / p) * (p - 1 )
# function to compute number # coprime pairs def CoPrimes():
# function call to compute
# euler totient function
computeTotient()
# prefix sum of all euler
# totient function values
for i in range ( 1 , N):
S[i] = S[i - 1 ] + phi[i]
# Driver code if __name__ = = "__main__" :
# function call
CoPrimes()
q = [ 3 , 4 ]
n = len (q)
for i in range (n):
print ( "Number of unordered coprime\n" +
"pairs of integers from 1 to " ,
q[i], " are " , S[q[i]])
# This code is contributed # by ChitraNayal |
// C# program to find number // of unordered coprime pairs // of integers from 1 to N using System;
class GFG
{ static int N = 100005;
// to store euler's // totient function static int [] phi;
// to store required answer static int [] S ;
// Computes and prints totient // of all numbers smaller than // or equal to N. static void computeTotient()
{ // Initialise the phi[] with 1
for ( int i = 1; i < N; i++)
phi[i] = i;
// Compute other Phi values
for ( int p = 2; p < N; p++)
{
// If phi[p] is not computed
// already, then number p is prime
if (phi[p] == p)
{
// Phi of a prime number p
// is always equal to p-1.
phi[p] = p - 1;
// Update phi values of
// all multiples of p
for ( int i = 2 * p;
i < N; i += p)
{
// Add contribution of
// p to its multiple i
// by multiplying
// with (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
} // function to compute // number coprime pairs static void CoPrimes()
{ // function call to compute
// euler totient function
computeTotient();
// prefix sum of all euler
// totient function values
for ( int i = 1; i < N; i++)
S[i] = S[i - 1] + phi[i];
} // Driver code public static void Main()
{ phi = new int [N];
S = new int [N];
// function call
CoPrimes();
int [] q = { 3, 4 };
int n = q.Length;
for ( int i = 0; i < n; i++)
Console.WriteLine( "Number of unordered coprime\n" +
"pairs of integers from 1 to " +
q[i] + " are " + S[q[i]] );
} } // This code is contributed // by mits |
<?php // PHP program to find number // of unordered coprime pairs // of integers from 1 to N $N = 100005;
// to store euler's totient function $phi = array_fill (0, $N , 0);
// to store required answer $S = array_fill (0, $N , 0);
// Computes and prints totient // of all numbers smaller than // or equal to N. function computeTotient()
{ global $N , $phi , $S ;
// Initialise the phi[] with 1
for ( $i = 1; $i < $N ; $i ++)
$phi [ $i ] = $i ;
// Compute other Phi values
for ( $p = 2; $p < $N ; $p ++)
{
// If phi[p] is not computed
// already, then number p
// is prime
if ( $phi [ $p ] == $p )
{
// Phi of a prime number p
// is always equal to p-1.
$phi [ $p ] = $p - 1;
// Update phi values of
// all multiples of p
for ( $i = 2 * $p ;
$i < $N ; $i += $p )
{
// Add contribution of p
// to its multiple i by
// multiplying with (1 - 1/p)
$phi [ $i ] = (int)(( $phi [ $i ] /
$p ) * ( $p - 1));
}
}
}
} // function to compute // number coprime pairs function CoPrimes()
{ global $N , $phi , $S ;
// function call to compute
// euler totient function
computeTotient();
// prefix sum of all euler
// totient function values
for ( $i = 1; $i < $N ; $i ++)
$S [ $i ] = $S [ $i - 1] + $phi [ $i ];
} // Driver code // function call CoPrimes(); $q = array ( 3, 4 );
$n = sizeof( $q );
for ( $i = 0; $i < $n ; $i ++)
echo "Number of unordered coprime\n" .
"pairs of integers from 1 to " .
$q [ $i ] . " are " . $S [ $q [ $i ]]. "\n" ;
// This code is contributed // by mits ?> |
<script> // Javascript program to find number of unordered // coprime pairs of integers from 1 to N let N = 100005;
// to store euler's
// totient function
let phi = new Array(N);
// to store required answer
let S = new Array(N);
for (let i = 0; i < N; i++)
{
phi[i] = 0;
S[i] = 0;
}
// Computes and prints totient
// of all numbers smaller than
// or equal to N.
function computeTotient()
{
// Initialise the phi[] with 1
for (let i = 1; i < N; i++)
phi[i] = i;
// Compute other Phi values
for (let p = 2; p < N; p++)
{
// If phi[p] is not computed
// already, then number p is prime
if (phi[p] == p)
{
// Phi of a prime number p
// is always equal to p-1.
phi[p] = p - 1;
// Update phi values of
// all multiples of p
for (let i = 2 * p; i < N; i += p)
{
// Add contribution of p to
// its multiple i by multiplying
// with (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
}
// function to compute
// number coprime pairs
function CoPrimes()
{
// function call to compute
// euler totient function
computeTotient();
// prefix sum of all euler
// totient function values
for (let i = 1; i < N; i++)
S[i] = S[i - 1] + phi[i];
}
// Driver code
// function call
CoPrimes();
let q = [ 3, 4 ];
let n = q.length;
for (let i = 0; i < n; i++)
document.write( "Number of unordered coprime<br>" +
"pairs of integers from 1 to " +
q[i] + " are " + S[q[i]] + "<br>" );
// This code is contributed by avanitrachhadiya2155
</script> |
Number of unordered coprime pairs of integers from 1 to 3 are 4 Number of unordered coprime pairs of integers from 1 to 4 are 6
Time Complexity: O(n + 1000053/2)
Auxiliary Space: O(100005)