Submission #493231

#TimeUsernameProblemLanguageResultExecution timeMemory
493231blueToys (CEOI18_toy)C++17
59 / 100
5056 ms6856 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> #include <map> using namespace std; #define sz(x) (int(x.size())) using vi = vector<int>; // map< int, vector<int> > res; vi sf; long long n; vector<int> res[40'000]; //i*i <= n vector<int> res2[40'000]; //i*i >= n, access n/i. vi solved(1+40'000, 0); vi solved2(1+40'000, 0); vector<int> factors[40'000]; vector<int> factors2[40'000]; vector<int>& get_res(long long u) { if(u*u <= n) return res[u]; else return res2[n/u]; } vector<int>& get_factors(long long u) { if(u*u <= n) return factors[u]; else return factors2[n/u]; } int& get_solved(long long u) { if(u*u <= n) return solved[u]; else return solved2[n/u]; } void solve(long long i) { // cerr << "solve " << i << '\n'; // if(solved[i]) return; // solved[i] = 1; get_solved(i) = 1; // cerr << "\n\n\n"; // cerr << "solve: " << i << '\n'; // cerr << "cond = " << int(res.find(i) != res.end()) << '\n'; // if(res.find(i) != res.end()) return; // cerr << "entered\n"; vi ans(1, i-1); // for(int j = 2; j < i && j*j <= i; j++) // cerr << "#\n"; // for(int y: sf) cerr << "y = " << y << '\n'; // cerr << "#2\n"; for(int j: get_factors(i)) { // cerr << "j = " << j << '\n'; if(j >= i || j*j > i) break; // cerr << i << " -> " << j << '\n'; long long u = j; long long v = i/j; solve(u); solve(v); for(int a: get_res(u)) for(int b: get_res(v)) ans.push_back(a+b); } sort(ans.begin(), ans.end()); ans.erase(unique(ans.begin(), ans.end()), ans.end()); // for(int a: ans) cerr << "a = " << a << '\n'; get_res(i) = ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; if(n == 1) { cout << "1\n 0\n"; return 0; } for(int i = 2; i <= n; i++) { // cerr << i << " " << n%i << ' ' << int(n%i == 0) << '\n'; if(n % i == 0) sf.push_back(i); } for(int a: sf) for(int b: sf) if(a < b && b%a==0) get_factors(b).push_back(a); solve(n); vi ans = res2[1]; // cerr << "sf init = " ; // for(int q: sf) cerr << q << " "; // cerr << "\n"; cout << sz(ans) << '\n'; for(int r: ans) cout << r << ' '; cout << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...