#include <cstdio>
#include <vector>
std::vector<int> divisors(int n)
// O(sqrt(n)))
{
std::vector<int> returned_divisors;
int i = 1;
while (i * i < n)
{
if (n % i == 0)
{
returned_divisors.push_back(i);
returned_divisors.push_back(n/i);
}
i++;
}
if (i * i == n)
returned_divisors.push_back(i);
return returned_divisors;
}
int n{};
int getNumberOfSolutions(int k)
// a * b == k: a >= 2, b >= 3
{
if (k <= 2)
return 0;
if (k % 2 == 0)
return divisors(k).size() - 3; // subtract: a == 1; b == 1; b == 2
else
return divisors(k).size() - 2; // subtract: a == 1; b == 1;
}
int main ()
{
scanf("%d", &n);
int sum{};
for (int d: divisors(n))
{
sum += getNumberOfSolutions(d - 1);
}
printf("%d\n", sum);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <cstdio> #include <vector> std::vector<int> divisors(int n) // O(sqrt(n))) { std::vector<int> returned_divisors; int i = 1; while (i * i < n) { if (n % i == 0) { returned_divisors.push_back(i); returned_divisors.push_back(n/i); } i++; } if (i * i == n) returned_divisors.push_back(i); return returned_divisors; } int n{}; int getNumberOfSolutions(int k) // a * b == k: a >= 2, b >= 3 { if (k <= 2) return 0; if (k % 2 == 0) return divisors(k).size() - 3; // subtract: a == 1; b == 1; b == 2 else return divisors(k).size() - 2; // subtract: a == 1; b == 1; } int main () { scanf("%d", &n); int sum{}; for (int d: divisors(n)) { sum += getNumberOfSolutions(d - 1); } printf("%d\n", sum); } |
English