博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj千题计划297:bzoj3629: [JLOI2014]聪明的燕姿
阅读量:6714 次
发布时间:2019-06-25

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

 

约数和定理:

若n的标准分解式为 p1^k1 * p2^k2 ……

那么n的约数和= π (Σ pi^xi ) xi∈[0,ki]

原本枚举小于S的质数,通过先判断S-1是不是质数 就可以 枚举根号S内的质数

 

#include
#include
using namespace std;#define N 1000000int prime[N+1],cnt;bool vis[N+1];int ans[N],tot;void pre(){ vis[1]=true; for(int i=2;i<=N;++i) { if(!vis[i]) prime[++cnt]=i; for(int j=1;j<=cnt;++j) { if(i*prime[j]>N) break; vis[i*prime[j]]=true; if(!(i%prime[j])) break; } }}bool isprime(int x){ if(x<=N) return !vis[x]; for(int i=1;prime[i]*prime[i]<=x;++i) if(!(x%prime[i])) return false; return true;}void dfs(int last,int num,int rest){ if(rest==1) { ans[++tot]=num; return; } if(rest-1>prime[last] && isprime(rest-1)) ans[++tot]=num*(rest-1); for(int i=last+1;prime[i]*prime[i]<=rest;++i) for(int sum=prime[i]+1,nnum=prime[i];sum<=rest;nnum*=prime[i],sum+=nnum) if(!(rest%sum)) dfs(i,num*nnum,rest/sum);}int main(){ pre(); int n; while(scanf("%d",&n)!=EOF) { tot=0; dfs(0,1,n); sort(ans+1,ans+tot+1); printf("%d\n",tot); for(int i=1;i<=tot;++i) printf("%d ",ans[i]); if(tot) printf("\n"); }}

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8611933.html

你可能感兴趣的文章
bgp发布路由对端无法收到,原因是使用默认网段
查看>>
JQuery实现简单的服务器轮询效果
查看>>
幽灵漏洞(GHOST)影响大量Linux操作系统及其发行版(更新修复方案)
查看>>
Sunday算法
查看>>
netstat
查看>>
优朋普乐:OTT正重构电视版图
查看>>
遇到"process launch failed: Security"问题,解决的一种方法
查看>>
Ubuntu 14.04 LTC 有线网络——网线不识别,灯不亮问题
查看>>
Unity3D DLL加密
查看>>
ubuntu root用户的密码
查看>>
linux ssh配置与禁用root远程登录
查看>>
Ngios plugin for cacti(NPC)
查看>>
求数组中最长递增子序列
查看>>
前端开发面试题(收集贴)
查看>>
Spring Boot cache backed redis
查看>>
有趣的编程----控制自己电脑的CPU
查看>>
linux的目录结构
查看>>
Java中创建对象的5种不同方法
查看>>
Supervisor安装
查看>>
自建框架知识点一命名空间和自动加载
查看>>