# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
966140 | Tob | Toys (CEOI18_toy) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#pragma GCC optimize("O3","unroll-loops")
#define ll long long
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef pair <ll, ll> pii;
const int C = 5007;
int cnt, dc;
vector <int> di[C];
unordered_map <int, int> did;
unordered_map <ll, int> sd;
vector <int> res;
inline ll Enc(ll x, ll y) {
return (x << 32) + y;
}
void rek(int n, int sum) {
int o = sd[Enc(n, sum)];
if (o) return;
sd[Enc(n, sum)] = 1;
if (n == 1) {
res.pb(sum);
return;
}
int x = did[n];
for (int y : di[x]) {
rek(n/y, sum + y - 1);
}
}
int main () {
FIO;
int n; cin >> n;
for (int i = 1; i*i <= n; i++) {
if (n % i) continue;
did[i] = ++dc;
for (int j = 2; j*j <= i; j++) {
if (i % j) continue;
di[dc].pb(j);
if (j * j != i) di[dc].pb(i/j);
}
di[dc].pb(i);
if (i * i != n) {
did[n/i] = ++dc;
for (int j = 2; j*j <= n/i; j++) {
if ((n/i) % j) continue;
di[dc].pb(j);
if (j * j != n/i) di[dc].pb(n/i/j);
}
di[dc].pb(n/i);
}
}
rek(n, 0);
sort(all(res));
cout << res.size() << "\n";
for (auto it : res) cout << it << " ";
return 0;