[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;
}

浙公网安备 33010602011771号