#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
class Program
{
private:
int n; // input sum of three numbers
int result; // result
vector<int> *a_vector;
vector<int> *x_vector;
bool CheckTrivial()
{
if (n < 7)
{
result = 0;
return true;
}
if (n == 7)
{
result = 1;
return true;
}
return false;
}
void FindDivisors()
{
int divisor = 1;
float barier = sqrtf(n);
while (divisor < barier)
{
if (n % divisor == 0)
{
a_vector->push_back(divisor);
a_vector->push_back(n / divisor);
}
divisor++;
}
if (divisor == barier) a_vector->push_back(divisor);
}
void FindXDivisors(unsigned int k)
{
if (x_vector != NULL) delete x_vector;
x_vector = new vector<int>();
int divisor = 2;
float barier = sqrtf(k);
while (divisor < barier)
{
if (k % divisor == 0)
{
x_vector->push_back(divisor);
x_vector->push_back(k / divisor);
}
divisor++;
}
if (divisor == barier) x_vector->push_back(divisor);
}
public:
Program()
{
// input data
cin >> n;
result = 0;
a_vector = new vector<int>();
x_vector = NULL;
}
~Program()
{
delete a_vector;
delete x_vector;
}
void FindAnswer()
{
if (CheckTrivial())
return;
// find divisors of n
FindDivisors();
for (int i = 0; i < a_vector->size(); i++)
{
// fill x_array with first divisors
FindXDivisors(n / a_vector->at(i) - 1);
for (int j = 0; j < x_vector->size(); j++)
{
if ((n / a_vector->at(i) - 1) / x_vector->at(j) - 1 > 1)
result++;
}
}
}
unsigned int ReturnAnswer()
{
return result;
}
};
int main()
{
Program P;
P.FindAnswer();
cout << P.ReturnAnswer() << endl;
return 0;
}
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #include <iostream> #include <vector> #include <math.h> using namespace std; class Program { private: int n; // input sum of three numbers int result; // result vector<int> *a_vector; vector<int> *x_vector; bool CheckTrivial() { if (n < 7) { result = 0; return true; } if (n == 7) { result = 1; return true; } return false; } void FindDivisors() { int divisor = 1; float barier = sqrtf(n); while (divisor < barier) { if (n % divisor == 0) { a_vector->push_back(divisor); a_vector->push_back(n / divisor); } divisor++; } if (divisor == barier) a_vector->push_back(divisor); } void FindXDivisors(unsigned int k) { if (x_vector != NULL) delete x_vector; x_vector = new vector<int>(); int divisor = 2; float barier = sqrtf(k); while (divisor < barier) { if (k % divisor == 0) { x_vector->push_back(divisor); x_vector->push_back(k / divisor); } divisor++; } if (divisor == barier) x_vector->push_back(divisor); } public: Program() { // input data cin >> n; result = 0; a_vector = new vector<int>(); x_vector = NULL; } ~Program() { delete a_vector; delete x_vector; } void FindAnswer() { if (CheckTrivial()) return; // find divisors of n FindDivisors(); for (int i = 0; i < a_vector->size(); i++) { // fill x_array with first divisors FindXDivisors(n / a_vector->at(i) - 1); for (int j = 0; j < x_vector->size(); j++) { if ((n / a_vector->at(i) - 1) / x_vector->at(j) - 1 > 1) result++; } } } unsigned int ReturnAnswer() { return result; } }; int main() { Program P; P.FindAnswer(); cout << P.ReturnAnswer() << endl; return 0; } |
English