Ваш алгоритм не использует какие-либо конкретные свойства a и b.В первой части каждая соответствующая запись массива A кратна a, но коэффициент не зависит от a, b и n.Настройка массива без учета фактора a, т. Е. Начиная с A [1] = 1, A [i] = i-1 для 2 <= i <= n, после вложенных циклов массив содержит <a href="http://en.wikipedia.org/wiki/Euler%27s_totient_function" rel="nofollow"> totients , то есть A [i] = phi (i), независимо от того, что a, b, n.Сумма значений от 1 до n - это количество элементов последовательности Фарея порядка n (плюс или минус 1, в зависимости от того, какие из 0/1 и 1/1 включены в используемое вами определение).Таким образом, ваш ответ всегда является приблизительным (a * количество терминов) / b, что близко, но не точно.
Я еще не смотрел, как ваш относится к алгоритму в статье, проверьте еще разобновления позже.
Приложение: Наконец-то было время посмотреть на бумагу.Ваша инициализация не то, что они дают.В их алгоритме A[q]
инициализируется в floor(x*q)
, для рационального x = a/b
правильная инициализация
for(i = 1; i <= n; ++i){
A[i] = (a*i)/b;
}
в оставшейся части вашего кода, только ans = sum/b;
должно быть изменено наans = sum;
.