제출 #966991

#제출 시각아이디문제언어결과실행 시간메모리
966991Charizard2021Toys (CEOI18_toy)C++17
59 / 100
5046 ms2608 KiB
#include<bits/stdc++.h>
using namespace std;
vector<int> factors;
vector<vector<int> > adj;
vector<set<int> > factorsSubtree;
void dfs(int u){
    for(int v : adj[u]){
        dfs(v);
        factorsSubtree[u].insert(v);
        for(int a : factorsSubtree[v]){
            factorsSubtree[u].insert(a);
        }
    }
}
int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= sqrt(n); i++){
        if(n % i == 0){
            factors.push_back(i);
            if(i * i != n){
                factors.push_back(n/i);
            }
        }
    }
    sort(factors.begin(), factors.end());
    adj.resize((int)factors.size());
    for(int i = 0; i < (int)factors.size(); i++){
        for(int j = i + 1; j < (int)factors.size(); j++){
            if(factors[j] % factors[i] == 0){
                adj[j].push_back(i);
            }
        }
    }
    factorsSubtree.resize((int)factors.size());
    dfs((int)factors.size() - 1);
    vector<set<int> > dp((int)factors.size());
    for(int i = 0; i < (int)factors.size(); i++){
        dp[i].insert(factors[i] - 1);
        for(int x : factorsSubtree[i]){
            for(int y : dp[x]){
                dp[i].insert(factors[i]/factors[x] - 1 + y);
            }
        }
    }
    cout << dp.back().size() << "\n";
    for(int i : dp.back()){
        cout << i << " ";
    }
    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...