Я хотел рассчитать количество пар (m,n), где GCD(m,n)=x, скажем, x=1 и 1‹=m‹=M=10^5 и 1‹=n‹=N=10^ 5.
M и N будут даны
Примечание. Мне просто нужно количество возможных пар, а не пар.
ОГРАНИЧЕНИЕ ПО ВРЕМЕНИ: 5 сек.
Приведенный ниже код хорошо работает для небольших чисел, но для больших выдает StackOverflowError.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class TestClass{
static long M;
static long N;
static long totalCount = 1;
public static void main(String[] args) throws Exception{
M = 100000;
N = 2000;
findCoPrimes(2, 1);
findCoPrimes(3, 1);
System.out.println(totalCount);
}
public static void findCoPrimes(int m, int n){
if ((n > N) || (m > M)){
return;
}
if (n != m && m <= N){
totalCount++;
}
totalCount++;
findCoPrimes(2*m - n, m);
findCoPrimes(2*m + n, m);
findCoPrimes(m + 2*n, n);
}
}
Может ли кто-нибудь помочь мне преобразовать эту рекурсивную функцию в итеративную функцию, чтобы избежать ошибки StackOverflow.
Пожалуйста, помогите мне найти решение для этого. Любые другие лучшие подходы также будут рассмотрены. В этом вопросе есть подсказка: используйте умные способы найти простые множители, а затем найдите количество взаимно простых пар. Грубая сила не сработает.