#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
const ll inf = 1e18;
const ll maxn = 1e18 + 4;
typedef long double ld;
const int N = 65, P = 5, prime[P] = {2, 3, 7, 61, 24251};
ll n, pn;
ll f[N];
inline ll mul(ll a, ll b, ll p) {
a %= p;
b %= p;
ll c = (ld)a*b/p;
c = a * b - c * p;
if(c < 0) c += p; else
if(c > p) c -= p;
return c;
}
inline ll ksm(ll x, ll y, ll p) {
ll s = 1;
while(y) {
if(y & 1) s = mul(s,x,p);
x = mul(x, x, p);
y >>= 1;
}
return s;
}
inline ll twice(ll a, ll p) {
ll d = p-1;
int t = 0;
while(!(d & 1)) d >>= 1, t++;
ll x, y;
x = y = ksm(a, d, p);
while(t--) {
y = mul(x, x, p);
if(y == 1 && (x ^ 1) && (x ^ p)-1) return 0;
x = y;
}
return y;
}
inline ll random(ll up) {
return (ll)rand()*rand()%up;
}
ll gcd(ll x, ll y) {
return !y?x:gcd(y, x % y);
}
inline ll abs(ll x, ll y) {
return x < y? y - x: x - y;
}
inline bool Miller_Rabin(ll x) {
for(int i = 0; i < P; i++) {
if(x == prime[i]) return true;
if(twice(prime[i], x)^1) return false;
}
return true;
}
inline ll trans(ll x, ll y, ll z) {
return (mul(x, x, z) + y) % z;
}
void Pollard_rho(ll m) {
if(Miller_Rabin(m)) {
f[++f[0]] = m;
return;
}
ll x1 = 0, x2 = 0, c = 0, p = 1;
while(p == 1 || p == m) {
x1 = trans(x1, c, m);
x2 = trans(trans(x2, c, m), c, m);
while(x1 == x2) {
c = random(m);
x1 = x2 = random(m);
x2 = trans(x2, c, m);
}
p = gcd(abs(x1 - x2), m);
}
Pollard_rho(p);
Pollard_rho(m/p);
}
int main() {
ll n; cin >> n;
if(n == 1){
cout << "NO" << endl;
return 0;
}
srand(time(NULL));
Pollard_rho(n);
sort(f + 1, f + 1 + f[0]);
f[0] = unique(f + 1, f + 1 + f[0]) - (f + 1);
for(int i = 1; i <= f[0]; i++){ //输出素因子个数
cout << f[i] << endl;
}
return 0;
}