Given array of N elements. Find number of coprime pairs.

1 <= N <= 30000

1 <= A[i] <= 10^8

TL: 0.6s

ML: 64MB

# | User | Rating |
---|---|---|

1 | MiFaFaOvO | 3681 |

2 | Um_nik | 3553 |

3 | tourist | 3515 |

4 | Benq | 3508 |

5 | ecnerwala | 3390 |

6 | TLE | 3223 |

7 | scott_wu | 3209 |

8 | Petr | 3205 |

9 | ksun48 | 3197 |

10 | Radewoosh | 3188 |

# | User | Contrib. |
---|---|---|

1 | Errichto | 204 |

2 | antontrygubO_o | 189 |

2 | pikmike | 189 |

4 | Monogon | 186 |

5 | vovuh | 184 |

6 | Ashishgup | 182 |

7 | Um_nik | 180 |

8 | SecondThread | 174 |

9 | Radewoosh | 172 |

10 | ko_osaga | 161 |

Given array of N elements. Find number of coprime pairs.

1 <= N <= 30000

1 <= A[i] <= 10^8

TL: 0.6s

ML: 64MB

↑

↓

Codeforces (c) Copyright 2010-2020 Mike Mirzayanov

The only programming contests Web 2.0 platform

Server time: Aug/15/2020 14:21:39 (h1).

Desktop version, switch to mobile version.

Supported by

User lists

Name |
---|

Hmmm, I don't really know. But, I'll let you know as soon as I come up with a solution! (If I come up with one) :D

Preprocess all the primes smaller than 10

^{8}by Eratosthenes Sieve.Now, for all the numbers

a_{ i}, make a vector of it's prime divisors (not counting the multiplicity). We will actually find the numbers of non-coprime pairs of numbers and subtract it fromn* (n- 1) / 2Suppose that, for some

i, we havea_{ i}=p_{1}*p_{2}* ... *p_{ k}. (We, again, disregard multiplicity). Note that the time allows us to go through all subsets of {p_{1},p_{2}, ...,p_{ k}} for alli. Build two maps, cnt[] and sgn[]. cnt[X] tells us how many times subset with product equal to X appears in all elements of array a[], while sgn[X] tells us how many elements the subset has.And for the finale just use the Inclusion — Exclusion Principle.

Can you please explain the time complexity part? I couldn't understand how the time is sufficient here. Since the primes vector size is ~1200(number of primes in [1,10000]), won't it take time to iterate through all these primes, for every element (n=30000, so 30000*1200 in the worst case), to get its vector of prime divisors? I am not aware of any other optimized approach here to get the vector. Any further explanation regarding what I am missing would be extremely helpful.

I'm the author of this task :) It appeared on the national programming competition in Serbia this year.

Problem 6 (In Serbian)

The intended solution for 100 points is what The_Wolfpack has written, with a small correction — you only need to process primes up to 10

^{4}.Hvala obojici :)

Can I get the aforementioned problem in English? I really liked that concept. Thank You very much.

It's identical to the problem posted in the blog: Find the number of pairs

i,j(1 ≤i<j≤n) such thatgcd(a_{ i},a_{ j}) = 1. Constraints are: 1 ≤N≤ 30000, 1 ≤a_{ i}≤ 10^{8}. TL = 0.6s. Problem statements are traditionally long and full of unnecessary details and stories.can you please provide that solution

I think that there exist a simpler solution, which allow us to calculate this value straightforwardly.

We want to maintain array $$$DP[x]$$$ — number of pairs $$$(a, b)$$$, that $$$GCD(a, b) = x$$$.

Let's iterate over all possible results of $$$GCD$$$ starting from the greatest element in array (lets call it $$$M$$$).

To count $$$DP[x]$$$ we only have to consider elements of array that are multiple of $$$x$$$. If $$$f(x)$$$ is the number of all pairs we can obtain from the set of $$$x$$$ elements, and $$$q(x)$$$ is number of elements that are multiple of $$$x$$$, then

The result is of course

Overall complexity:

Can you please explain your logic with some example? I mean how will it manipulates in code.. Thanks in Advance :D

It's simpler but unfortunately it won't work here because $$$M = 10^8$$$.

I have this approach, but I dont know is this a good way. Correct me if I am wrongI think you can calculate the number of coprimes to n aka ϕ(n)

we can calculate ϕ(1 -> n) in O(n log log n)

Euler totient functionAfter that we just need to calculate the sum of ϕ(1) + ϕ(2) + ... + ϕ(n)

If you need to solve for queies. Using prefix sum array can help you answer the problem in O(1) after O(n log log n) precalculating

I think you should read the problem again carefully, particularly this comment

I think the problem asking about find number of pair(i, j) where 1 ≤ i, j ≤ n and gcd(i, j) = 1.

So I calculate ϕ(j) for every 1 ≤ j ≤ n. Then I will know the number i in range [1..j] that gcd(i, j) = 1

Then I calculate the sum of all ϕ(j) in range [1..n].

Is my approach correct problemsetter ?

Ah, number of pair(ai, aj). Sorry for my reading the problem carelessly

So how about this new approach

For each pair (i, j) that 1 ≤ i ≤ j ≤ n

I increase the result whenever gcd(ai, aj) = 1

Time Complexity: O(n ^ 2 log (n ^ 2))

2 numbers are co-prime if their SPFs are different.

Preprocess all the SPFs and then store the SPFs of the numbers in the array in map.

Now you will have the numbers whose SPFs is the same.

Let ans =

n*(n+1)/2(n = size of the array), now you could iterate through the map and subtract the^{sizeofmap}C_{2}from the answer.Edit: the above idea of 2 numbers being co-prime is just an observation. Point it if i'm wrong

False: 10, 15

What the hell is SPF? Googling doesn't give much after filtering out sunscreen and sender policy framework.

smallest prime factor. ignore it though i'm very very wrong in my solution ,i didn't realize it.