JLOI2014 聪明的燕姿【搜索-细节】
题目解析
两个公式:
整数唯一分解定理:
约数和定理:
然后可以搜索质因子和它们的指数,记录下当前还剩多少和,已经枚举到的第个质数,目前产生的答案。
需要剪枝:若,有,而我们又是递增枚举这个的,所以后面就不用枚举了,这个一定不合法(那么所提到的这个答案在就已经算过了(因为从小到大))
除非它是最后一个,后面没有数,也就是,那么这种情况可以特判:
如果是质数,并且比上一次枚举到的质因子大,那么就把也算入答案。
这道题输出调了我好久(见注释,果然是太菜了嘛
虽然我没有燕姿那么聪明,但是希望我也能找到自己等的人叭,不需要所有,有就够了。
►Code View
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define LL long long
#define N 100005
#define INF 0x3f3f3f3f
int rd()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48); c=getchar();}
return f*x;
}
int prim[N],pn;
bool vis[N];
int ans[N],cnt;
void Sieve()
{
for(int i=2;i<N;i++)
{
if(!vis[i]) prim[++pn]=i;
for(int j=1;j<=pn&&prim[j]*i<N;j++)
{
vis[i*prim[j]]=1;
if(i%prim[j]==0) break;
}
}
}
bool check(int x)
{
if(x==1) return 0;
for(int i=1;prim[i]*prim[i]<=x;i++)
if(x%prim[i]==0) return 0;
return 1;
}
void dfs(int now,int i,int x)
{//还剩多少没有分解 第几个质数 当前答案
if(now==1)
{
ans[++cnt]=x;
return ;
}
if(check(now-1)&&now-1>prim[i]) ans[++cnt]=(now-1)*x;//sum-1是满足条件的一个质因子
for(int j=i+1;prim[j]*prim[j]<=now;j++)
{//枚举质因子
int sum=1+prim[j],lst=prim[j];
while(sum<=now)
{
if(now%sum==0) dfs(now/sum,j,x*lst);
lst*=prim[j],sum+=lst;
}
}
}
int main()
{
Sieve();
int s;
while(scanf("%d",&s)!=EOF)
{
cnt=0;
dfs(s,0,1);
sort(ans+1,ans+cnt+1);
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
if(cnt) puts("");//Cao 注意格式啊 如果没有数 那么就没有这个换行 也不能这么打(见下
/*
for(int i=1;i<cnt;i++)
printf("%d ",ans[i]);
printf("%d\n,ans[cnt]);
因为不知道cnt有没有 如果cnt==0 就会多输出一个ans[0]啊
*/
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现