用到了算数基本定理的思想,欧拉筛的不记录最小质因子的板子,另外在优化dfs的时候还用到了小学生求素数的一点小思想,下面我们简单说一下思路和分析几个问题。
思路:正约数之和等于s的数,容易想到直接枚举每一个质数与每一个质数的数量,然后进行优化。
第一个问题:欧拉筛存质数的数组到底开多大?
这个问题,谁一开始写这个代码也不知道,除非花了很多时间分析,所以我们先保留这个问题。
第二个问题:如何优化枚举。
(1)先枚举数量还是先枚举质数?
答:先枚举质数比较好,因为我们可以让下一次dfs调用,枚举素数开始的位置为上一次枚举素数结果的下一项,也是一种小优化。
(2)枚举素数的终止条件是什么?
**答:**我们每一层dfs都有一个now表示的是s除以每一层dfs得到的乘数之后的结果,只有(1+p+p^2+…+ p ^ k) 为因子时,我们才算找到一个结果,那么对于很大的p来说,只要p>sqrt(now),那么其实到1+p+p ^ 2 来说,乘数就已经比now还要大了,那么其实我们对每一层的dfs就可以就行如下优化了
1.判断1+p (这里的p我们默认为大于sqrt(now))是否等于now,然后判断p是否为素数,这样就排除了所有大于sqrt(now)的p的正解。
2.枚举素数时,我们只枚举sqrt(now)以内的素数,枚举数量时,枚举到(1+p+p^2+…+ p ^ k) 小于等于now即可
最后悄悄说一句:wlz是傻dei

1296. 聪明的燕姿
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。

可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!

燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S,那么自己等的人手上的号码牌数字的所有正约数之和必定等于 S。

所以燕姿总是拿着号码牌在地铁和人海找数字(喂!这样真的靠谱吗)。

可是她忙着唱《绿光》,想拜托你写一个程序能够快速地找到所有自己等的人。

输入格式
输入包含 k 组数据。

对于每组数据,输入包含一个号码牌 S。

输出格式
对于每组数据,输出有两行。

第一行包含一个整数 m,表示有 m 个等的人。

第二行包含相应的 m 个数,表示所有等的人的号码牌。

注意:你输出的号码牌必须按照升序排列。

数据范围
1≤k≤100,
1≤S≤2×109
输入样例:
42
输出样例:
3
20 26 41

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1 * 1e6 + 15;
typedef long long ll;
int s,cmy,k;
int res[N];
ll p[N];
bool book[N];
void oula()
{for(int i = 2; i < N; i ++){if(!book[i]){p[++cmy] = i;}for(int j = 1; j <= cmy && p[j] * i < N; j ++){int t = p[j] * i;book[t] = true;if(i % p[j] == 0) break;}}
}
bool is_prime(ll x)
{if(x < N) return !book[x];else{if(x == 1) return false;if(x == 2) return true;if(x % 2 == 0) return false;for(int i = 3; i <= sqrt(x); i += 2) if(x % i == 0) return false;return true;}
}
void dfs(int last, ll now, ll sniper)
{if(now == 1){res[k ++] = sniper;return;}if(now - 1 > p[last] && is_prime(now - 1)){res[k ++] = sniper * (now - 1);}for(int i = last + 1; i <= cmy && p[i] * p[i] <= now; i ++){for(ll j = p[i] + 1, tmp = p[i]; j <= now; tmp *= p[i], j += tmp){if(now % j == 0) dfs(i , now / j, sniper * tmp);}}
}
int main()
{oula();while(scanf("%d",&s) != EOF){k = 0;dfs(0,s,1);sort(res,res+k);bool flag = false;printf("%d\n",k);for(int i = 0; i < k; i ++){if(!flag){flag = true;printf("%d",res[i]);}else printf(" %d",res[i]);}if(k) puts("");}return 0;
}

acWing 1296 聪明的燕姿相关推荐

  1. 一本通1629聪明的燕姿

    1629:聪明的燕姿 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁. 可是燕 ...

  2. [JLOI2014]聪明的燕姿(搜索)

    城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁. 可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S, ...

  3. [BZOJ 3629][JLOI2014]聪明的燕姿

    传送门 \(\color{green}{solution}\) 爆搜题 /**************************************************************P ...

  4. 2017.9.11 聪明的燕姿 失败总结

    这题有毒.如假包换的爆搜 只要知道一个数的约数加起来=分解质因数后每个  质因数1~pi次前缀和  相乘的结果 就好 做(sou)了 所以如果知道约数和,就可以枚举质因数来爆搜 必须剪枝到极致才能过, ...

  5. AcWing 499. 聪明的质监员

    解题思路: https://www.acwing.com/solution/content/33961/ 代码如下: #include <iostream> using namespace ...

  6. AcWing蓝桥杯AB组辅导课08、数论

    文章目录 前言 一.数论 例题 例题1:AcWing 1246. 等差数列(最大公约数,第十届蓝桥杯省赛C++B第7题) 分析 题解:最大公约数 例题2:AcWing 1295. X的因子链(算数基本 ...

  7. YBT 6 数学基础

    $补+写题ing$ 第 1 章 快速幂 序列的第 k 个数 link $solution:$ 板子 A 的 B 次方 link $solution:$ 板子 [NOIP2013] 转圈游戏 link ...

  8. 算法笔记——数学相关

    算法笔记--数学相关 高精度 乘法逆元 排列组合 二项式定理 质数的判定和应用 约数 拓展欧几里得 大步小步算法(BSGS) 拓展大步小步算法 快速乘和快速幂 矩阵相关 欧拉函数 欧拉定理及费马小定理 ...

  9. 《信息学奥赛一本通》提高版题单

    第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...

  10. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

最新文章

  1. Android adb opendir failed ,permission denied
  2. 【转】开发人员一定要加入收藏夹的网站
  3. mysql io_MySQL服务器 IO 100%的分析与优化方案
  4. SaaS模式云数据仓库:持续保护云上数据及服务安全
  5. Storm精华问答 | storm与Hadoop有什么区别?
  6. fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解
  7. python中字典dict的方法fromkeys
  8. java前端开发自动生成器_一个简单实用的java代码生成器
  9. java中继承applet类_Java - 33 Java Applet基础
  10. 从零开始之驱动发开、linux驱动(二十、linux设备驱动中的并发控制)
  11. 小白求职准备,一些资料汇总,持续更新(工科转Java开发方向)
  12. 前端适配不同型号手机分辨率,100%还原UI设计稿的方案实践
  13. 三入职场 - 你可以从我身上学到这些(附毕业Vlog)
  14. Security:如何安装 Elastic SIEM 和 EDR
  15. 对于矩估计的一些理解
  16. 六、完成Teigha.net在界面插入直线,多线段,弧线,圆形,点,图片,dwf文件等功能
  17. ff14注册完服务器可以转,FF14怎么转服 FF14转服条件一览-游侠网
  18. 钢管直线度测量方法产品平直度检测设备
  19. SQL Server 索引
  20. piwik java版_Piwik Mobile 2 - Web Analytics

热门文章

  1. 查询同一组的最大最小值及明细
  2. Linux使用笔记: 使用Samba访问windows的共享目录(转载)
  3. java 操作linux_java程序里调用linux命令
  4. 拓端tecdat|R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例
  5. python list 分批batch
  6. os.path.join()函数
  7. Image Segmentation(图像分割)网络结构比较
  8. python读取mat文件报错【NotImplementedError: Please use HDF reader for matlab v7.3 files】
  9. Eclipse 中最常用的快捷键大全
  10. matlab preparets,请问吧里有大神做过MATLAB时间序列神经网络(NARX)吗?