fork(1) download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int gcd(int m, int n) // Поиск наибольшего общего делителя
  5. {
  6. while(m && n) if (m < n) n %= m; else m %= n;
  7. return m + n;
  8. }
  9.  
  10. // Все возможные простые делители чисел до 5000
  11. int primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67 };
  12.  
  13. // Проверка числа на k общих делителей
  14. bool cnt(int n, int m, int k)
  15. {
  16. int g = gcd(n,m); // НОД
  17. int total = 1; // Количество общих делителей
  18.  
  19. // факторизуем НОД на простые сомножители; количество делителей -
  20. // произведение их степеней, увеличенных на 1
  21. for(int i = 0; g > 1 && i < sizeof(primes)/sizeof(primes[0]); ++i)
  22. {
  23. int l = 0;
  24. while(g%primes[i] == 0) { g /= primes[i]; ++l; }
  25. total *= l+1;
  26. }
  27. return total == k;
  28. }
  29.  
  30. int main(int argc, const char * argv[])
  31. {
  32. int n, k, count = 0;
  33. cin >> n >> k;
  34.  
  35. // Перебор всех чисел
  36. for(int m = 1; m < n; ++m)
  37. if (cnt(n,m,k)) count++;
  38.  
  39. cout << count << endl;
  40. }
  41.  
Success #stdin #stdout 0s 4348KB
stdin
5000 2
stdout
1400