[CEOI2018] toy 解题记录

[CEOI2018] toy 解题记录


题意简述

题目描述给得非常的绕,看了半天才看懂。
结合一组数据理解一下:
样例输入

10

样例输出

2
5 9

其中 \(5\) 说明集合 \(\{1,4\}\),有组合方案:
\(\{1,4\},\{1,3\},\{1,2\},\{1,1\},\{1,0\},\)
\(\{0,4\},\{0,3\},\{0,2\},\{0,1\},\{0,0\}\)
其余同理。


题目分析

通过观察样例可以发现,对于集合 \(S\) 中的每一个元素 \(i\) ,它对答案的贡献都为 \(i+1\),所以根据乘法原理,每个集合的贡献就是 \(\prod\limits^{|S|}_{i=1}S_i\)。(所有元素 \(+1\) 后累乘起来的 \(=n\))。
这时候就会惊奇地发现:这不就是 \(n\) 的因式分解吗?
于是就可以愉快地切了此题


AC Code

#include<bits/stdc++.h>
#define arrout(a,n) rep(i,1,n)std::cout<<a[i]<<" "
#define arrin(a,n) rep(i,1,n)std::cin>>a[i]
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define dep(i,x,n) for(int i=x;i>=n;i--)
#define erg(i,x) for(int i=head[x];i;i=e[i].nex)
#define dbg(x) std::cout<<#x<<":"<<x<<" "
#define mem(a,x) memset(a,x,sizeof a)
#define all(x) x.begin(),x.end()
#define arrall(a,n) a+1,a+1+n
#define PII std::pair<int,int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
CI N=1e7+5;
int n,r,a[N];
void dfs(int now,int last,int sum){
    if(now>=last){
        a[++a[0]]=sum+now-1;
    }
    for(int i=last;i*i<=now;i++){
        if(now%i==0){
            dfs(now/i,i,sum+i-1);
        }
    }
}
signed main() {
    std::cin>>n;
    dfs(n,2,0);
    std::sort(arrall(a,a[0]));
    a[0]=std::unique(arrall(a,a[0]))-a-1;
    std::cout<<a[0]<<"\n";
    arrout(a,a[0]);
    return 0;
}
posted @ 2024-03-06 21:51  Li_Feiy  阅读(20)  评论(0)    收藏  举报