\(\color{green}{solution}\)
爆搜题
/**************************************************************
Problem: 3629
User: MiEcoku
Language: C++
Result: Accepted
Time:164 ms
Memory:2468 kb
****************************************************************/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100010;
int t, cnt, n, ans[maxn], prim[maxn], book[maxn];
bool isprim(int x) {
for ( register int i = 1; prim[i]*prim[i] <= x; ++ i)
if( x % prim[i] == 0) return false;
return true;
}
inline void dfs(int l, int op, int now) {
if( now == 1) { ans[++ cnt]= op; return;}
if( now-1 >= prim[l] && isprim(now-1)) ans[++ cnt] = op * (now-1);
for ( register int i = l; prim[i] * prim[i] <= now; ++ i) {
for ( ll sum=1 + prim[i], p = prim[i]; sum <= now; p = p*prim[i], sum += p)
if( !(now%sum)) dfs(i+1, op*p, now/sum);
}
}
int main() {
for ( register int i = 2; i <= 1e5; ++ i) {
if( !book[i]) prim[++ t] = i;
for ( register int k = 1; k <= t && prim[k]*i <= 1e5; ++ k) {
book[i * prim[k]] = 1;
if( i % prim[k] == 0) break;
}
}
while ( ~scanf("%d", &n)) {
cnt = 0; dfs(1, 1, n); sort(ans+1, ans+1+cnt);
printf("%d\n", cnt);
for ( register int i = 1; i <= cnt; ++ i) {
printf(i == cnt ? "%d\n" : "%d ", ans[i]);
}
}
return 0;
}