萌新刚学oi,代码全wa求助
查看原帖
萌新刚学oi,代码全wa求助
1009887
yysyys楼主2023/5/20 16:04

已过样例

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100010;
int n,ans,c[N],v[N],cnt,an[N];
bool pd(int x) {
	for(int i=1;c[i]<=sqrt(x);i++)
	    if(x%c[i]==0)
	        return false;
	return true;
}
void dfs(int wz,int da,int sx) {//第wz个质数,数为da,还剩sx没分
	if(sx==1) {
		an[++ans]=da;
		return ;
	}
	if(sx-1>=c[wz]&&pd(sx-1)) 
	    an[++ans]=da*(sx-1);
	for(int i=wz+1;i<=cnt&&c[i]*c[i]<=sx;i++) {
		int jl=1+c[i],j=c[i];
		while(jl<=sx) {
			if(sx%jl==0) 
				dfs(i,da*j,sx/jl);
			j=j*c[i];
			jl+=j;
		}
	}
}
signed main(){
	for(int i=2;i<=N;i++) {
		if(v[i]==0) {
			v[i]=i;
			c[++cnt]=i;
		}
		for(int j=1;j<=cnt;j++) {
			if(c[j]*i>N) break ;
			v[c[j]*i]=c[j];
		}
	}
	while(scanf("%lld",&n)!=EOF) {
		memset(an,0,sizeof(an));
		ans=0;
		dfs(0,1,n);
		printf("%lld\n",ans);
		sort(an+1,an+ans+1);
		for(int i=1;i<=ans;i++)
		    printf("%lld ",an[i]);
		if(ans!=0) printf("\n");
	}
	return 0;
}

2023/5/20 16:04
加载中...