Related Articles

# Number of pairs of lines having integer intersection points

• Difficulty Level : Hard
• Last Updated : 23 Apr, 2021

Given two integer arrays P[] and Q[], where pi and qj for each 0 <= i < size(P) and 0 <= j < size(Q) represents the line equations x – y = -pi and x + y = qj respectively. The task is to find the number of pairs from P[] and Q[] having integer intersection points.

Examples:

Input: P[] = {1, 3, 2}, Q[] = {3, 0}
Output:
The pairs of lines (p, q) having integer intersection points are (1, 3), (2, 0) and (3, 3). Here p is the line parameter of P[] and q is the that of Q[].

Input: P[] = {1, 4, 3, 2}, Q[] = {3, 6, 10, 11}
Output:

Approach:

• The problem can be solved easily by solving the two equations and analyzing the condition for integer intersection points.
• The two equations are x – y = -p and x + y = q.
• Solving for x and y we get, x = (q-p)/2 and y = (p+q)/2.
• It is clear that integer intersection point is possible if and only if p and q have same parity.
• Let p0 and p1 be the number of even and odd pi respectively.
• Similarly, q0 and q1 for the number of even and odd qi respectively.
• Therefore the required answers is p0 * q0 + p1 * q1.

Below is the implementation of the above approach:

## C++

 `// C++ program to Number of pairs of lines``// having integer intersection points` `#include ``using` `namespace` `std;` `// Count number of pairs of lines``// having integer intersection point``int` `countPairs(``int``* P, ``int``* Q, ``int` `N, ``int` `M)``{``    ``// Initialize arrays to store counts``    ``int` `A = { 0 }, B = { 0 };` `    ``// Count number of odd and even Pi``    ``for` `(``int` `i = 0; i < N; i++)``        ``A[P[i] % 2]++;` `    ``// Count number of odd and even Qi``    ``for` `(``int` `i = 0; i < M; i++)``        ``B[Q[i] % 2]++;` `    ``// Return the count of pairs``    ``return` `(A * B + A * B);``}` `// Driver code``int` `main()``{``    ``int` `P[] = { 1, 3, 2 }, Q[] = { 3, 0 };``    ``int` `N = ``sizeof``(P) / ``sizeof``(P);``    ``int` `M = ``sizeof``(Q) / ``sizeof``(Q);` `    ``cout << countPairs(P, Q, N, M);` `    ``return` `0;``}`

## Java

 `// Java program to Number of pairs of lines``// having integer intersection points``class` `GFG``{` `// Count number of pairs of lines``// having integer intersection point``static` `int` `countPairs(``int` `[]P, ``int` `[]Q,``                      ``int` `N, ``int` `M)``{``    ``// Initialize arrays to store counts``    ``int` `[]A = ``new` `int``[``2``], B = ``new` `int``[``2``];` `    ``// Count number of odd and even Pi``    ``for` `(``int` `i = ``0``; i < N; i++)``        ``A[P[i] % ``2``]++;` `    ``// Count number of odd and even Qi``    ``for` `(``int` `i = ``0``; i < M; i++)``        ``B[Q[i] % ``2``]++;` `    ``// Return the count of pairs``    ``return` `(A[``0``] * B[``0``] + A[``1``] * B[``1``]);``}` `// Driver code``public` `static` `void` `main(String[] args)``{``    ``int` `[]P = { ``1``, ``3``, ``2` `};``    ``int` `[]Q = { ``3``, ``0` `};``    ``int` `N = P.length;``    ``int` `M = Q.length;` `    ``System.out.print(countPairs(P, Q, N, M));``}``}` `// This code is contributed by Rajput-Ji`

## Python3

 `# Python3 program to Number of pairs of lines``# having eger ersection pos` `# Count number of pairs of lines``# having eger ersection po``def` `countPairs(P, Q, N, M):``    ` `    ``# Initialize arrays to store counts``    ``A ``=` `[``0``] ``*` `2``    ``B ``=` `[``0``] ``*` `2` `    ``# Count number of odd and even Pi``    ``for` `i ``in` `range``(N):``        ``A[P[i] ``%` `2``] ``+``=` `1` `    ``# Count number of odd and even Qi``    ``for` `i ``in` `range``(M):``        ``B[Q[i] ``%` `2``] ``+``=` `1` `    ``# Return the count of pairs``    ``return` `(A[``0``] ``*` `B[``0``] ``+` `A[``1``] ``*` `B[``1``])` `# Driver code` `P ``=` `[``1``, ``3``, ``2``]``Q ``=` `[``3``, ``0``]``N ``=` `len``(P)``M ``=` `len``(Q)` `print``(countPairs(P, Q, N, M))` `# This code is contributed by mohit kumar 29`

## C#

 `// C# program to Number of pairs of lines``// having integer intersection points``using` `System;` `class` `GFG``{``    ` `    ``// Count number of pairs of lines``    ``// having integer intersection point``    ``static` `int` `countPairs(``int` `[]P, ``int` `[]Q,``                        ``int` `N, ``int` `M)``    ``{``        ``// Initialize arrays to store counts``        ``int` `[]A = ``new` `int``;``        ``int` `[]B = ``new` `int``;``    ` `        ``// Count number of odd and even Pi``        ``for` `(``int` `i = 0; i < N; i++)``            ``A[P[i] % 2]++;``    ` `        ``// Count number of odd and even Qi``        ``for` `(``int` `i = 0; i < M; i++)``            ``B[Q[i] % 2]++;``    ` `        ``// Return the count of pairs``        ``return` `(A * B + A * B);``    ``}``    ` `    ``// Driver code``    ``public` `static` `void` `Main()``    ``{``        ``int` `[]P = { 1, 3, 2 };``        ``int` `[]Q = { 3, 0 };``        ``int` `N = P.Length;``        ``int` `M = Q.Length;``    ` `        ``Console.Write(countPairs(P, Q, N, M));``    ``}``}` `// This code is contributed by AnkitRai01`

## Javascript

 ``
Output:
`3`

Time Complexity: O(P + Q)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up