Submission #493239

#TimeUsernameProblemLanguageResultExecution timeMemory
493239blueToys (CEOI18_toy)C++17
79 / 100
2356 ms67744 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> #include <map> #include <cassert> using namespace std; #define sz(x) (int(x.size())) using vi = vector<int>; using ll = long long; // 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) { if(get_solved(i)) return; else get_solved(i) = 1; vi ans(1, i-1); for(ll 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)) { // if(b > a) break; 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; assert(n <= 3'0000'0000); 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(i*i > n) break; if(n % i == 0) { sf.push_back(i); sf.push_back(n/i); } } // for(int i = 2; i <= n; i++) // { // // cerr << i << " " << n%i << ' ' << int(n%i == 0) << '\n'; // if(n % i == 0) // sf.push_back(i); // } sf.push_back(n); sort(sf.begin(), sf.end()); sf.erase(unique(sf.begin(), sf.end()), sf.end()); // for(int q: sf) cerr << q << ' '; // cerr << '\n'; 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...