博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3629 约数和定理+搜索
阅读量:7105 次
发布时间:2019-06-28

本文共 1296 字,大约阅读时间需要 4 分钟。

呃呃

看到了这道题 没有任何思路…… 百度了一发题解 说要用约数和定理
就查了一发
(不会的可以先学习一下)

然后呢 我们考虑枚举约数

先线性筛一遍10^5以下的 10^5以上的数可以用已经筛过的素因数枚举

最后就搜一下就好了 (记得判断=1的情况)

还有 此题PE很坑爹

不能有行末空格 0的情况不用输出空行

//By SiriusRen#include 
#include
#include
using namespace std;#define N 100000int s,cnt,pri[N],Ans[N];bool p[N+5];void get_prime(){ for(int i=2;i<=N;i++){ if(!p[i])pri[++cnt]=i; for(int j=1;j<=cnt&&i*pri[j]<=N;j++){ p[i*pri[j]]=1; if(i%pri[j]==0)break; } }}bool is_prime(int x){ if(x<=N)return !p[x]; int temp=sqrt(x); for(int i=1;pri[i]<=temp;i++) if(x%pri[i]==0)return 0; return 1;}void dfs(int last,int ans,int sum){ if(sum==1){Ans[++cnt]=ans;return;} if(sum-1>pri[last]&&is_prime(sum-1))Ans[++cnt]=ans*(sum-1); for(int i=last+1;pri[i]*pri[i]<=sum;i++) for(int psum=pri[i]+1,div=pri[i];psum<=sum;div*=pri[i],psum+=div) if(sum%psum==0)dfs(i,ans*div,sum/psum);}int main(){ get_prime(); while(~scanf("%d",&s)){ cnt=0,dfs(0,1,s); sort(Ans+1,Ans+1+cnt); printf("%d\n",cnt); for(int i=1;i<=cnt;i++){ printf("%d",Ans[i]); if(i!=cnt)putchar(' '); } if(cnt)puts(""); }}

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532249.html

你可能感兴趣的文章
(译)一个完整的Django入门指南---第7部分
查看>>
树莓派入门到放弃
查看>>
区块链技术公司 聊区块链与AI结合
查看>>
微服务场景下性能问题排查神器之xrebel
查看>>
微信小程序input组件type属性3个值的作用
查看>>
QQ 机器人平台 Newbe.Mahua 2.1 支持 Websocket
查看>>
【监控文件夹并将增加和删除的文件列表发送邮件完美脚本】-未来星开发开发团队...
查看>>
AndroidStudio无法输出日志的Bug
查看>>
TypeScript基础入门 - 接口 - 函数类型
查看>>
lombok_学习_00_资源帖
查看>>
搜集用 LLVM 创造动态语言的例子
查看>>
第159天:前端知识体系框架
查看>>
Spring AOP注解为什么失效?90%Java程序员不知道
查看>>
Json学习
查看>>
Airbnb: React Native 从选择到放弃
查看>>
Eclipse中Tomcat配置问题
查看>>
Linux下使用split按行数进行切割
查看>>
盘点2015年英特尔旧金山IDF峰会上的黑科技
查看>>
SQL性能优化
查看>>
U盘安装Ubuntu 16.04出现:Failed to load ldlinux.c32
查看>>