题意

给出一个数 \(S\) ,输出所有约数和等于 \(S\) 的数。

\(S \le 2 \times 10^9\) ,数据组数 \(\le 100\) 。

题解

首先用约数和定理:

\[\begin{align}
n &= \prod_{i} p_i^{a_i} \\
\Rightarrow \sigma(n) &= \prod_{i} (\sum_{j=0}^{a_i} p_i^j)
\end{align}
\]

那么,我们可以通过从小到大来枚举质数 \(p_i\) 及其指数 \(a_i\) 来搜索。

  • 若当前需要得到的 \(S\) 可以表示为一个未搜索过的质数与 \(1\) 的和,那么之前的数与这个质数的乘积是一个合法答案。

  • 对于每一个使得 \((p + 1) \times (p + 1) < S\) 的 \(p\) ,枚举可能的 \(a_i\) ,递归。

    因为在第一种情况会把 \(a_i = 1\) 的特判掉(这种数出现并且仅出现一次),然后剩下的 \(a_i \ge 2\) ,所以至少为 \(1 + p + p ^ 2\) 。

最后当一直除到 \(1\) 的时候就是答案了qwq

最开始随便用筛法筛素数就行了,复杂度 \(O(pass)\) 。。。

总结

对于约数和之类的题,考虑对于 \(a_i = 1\) 与 \(a_i \ge 2\) 的情况分别考虑就行了,前者只存在一个,后者 \(\le \sqrt p\) 。

代码

随便看看实现就行了。。跑的速度还行qwq

#include <bits/stdc++.h>

#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair using namespace std; template<typename T> inline bool chkmin(T &a, T b) {return b < a ? a = b, 1 : 0;}
template<typename T> inline bool chkmax(T &a, T b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("2234.in", "r", stdin);
freopen ("2234.out", "w", stdout);
#endif
} set<int> S; const int Maxn = sqrt(2e9);
bitset<Maxn + 5> is_prime; void Math_Init(int maxn) {
is_prime.set();
is_prime[0] = is_prime[1] = false;
For (i, 2, maxn) if (is_prime[i])
for (int j = i * 2; j <= maxn; j += i) is_prime[j] = false;
} inline bool Judge(int x) {
if (x <= Maxn) return is_prime[x];
for (int i = 2; i * i <= x; ++ i)
if (!(x % i)) return false;
return true;
} void Dfs(int x, int cur, int pre) {
if (x == 1) { S.insert(cur); return ; }
if (x - 1 > pre && Judge(x - 1))
S.insert(cur * (x - 1)); For (p, pre + 1, sqrt(x + .5))
if (is_prime[p]) {
int sum = p + 1, here = p;
while (sum <= x) {
if (!(x % sum))
Dfs(x / sum, cur * here, p);
here *= p; sum += here;
}
}
} int main () { File(); Math_Init(Maxn); int x;
while (~scanf("%d", &x)) {
S.clear(); Dfs(x, 1, 1);
printf ("%d\n", (int)S.size());
for (int cur : S) printf ("%d ", cur);
if ((bool)S.size()) putchar ('\n');
} return 0; }

LOJ #2234. 「JLOI2014」聪明的燕姿(搜索 + 数论)的更多相关文章

  1. 「JLOI2014」聪明的燕姿

    传送门 Luogu 解题思路 很容易想到直接构造合法的数,但是这显然是会T飞的. 我们需要考虑这样一件事: 对于一个数 \(n\),对其进行质因数分解: \[n=\sum_{i=1}^x p_i^{c ...

  2. LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)

    题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...

  3. Loj#6434「PKUSC2018」主斗地(搜索)

    题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\( ...

  4. BZOJ3629(JLOI2014)聪明的燕姿

    (⊙﹏⊙)我交了好久,有坑啊...(如果没有匹配的话,即输出0种情况要记得换行...) 就是搜索,加上一点数论,并不太难... #include<cstdio> #include<c ...

  5. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  6. Loj #2529. 「ZJOI2018」胖

    Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...

  7. BZOJ_3629_[JLOI2014]聪明的燕姿_dfs

    BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...

  8. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  9. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

随机推荐

  1. Vmware由于centos升级内核不可运行(C header files matching your running kernel were not found)的解决方案

    C header files matching your running kernel were not found. Refer to your distribution's documentati ...

  2. h5-语义化标签

    ###1.语义化标签 在h5之前,在开发过程中大量div的id名称重复,例如div id="footer"来标记页脚内容,所以html5元素引入了语义化标签(一组新的片段类元素)  ...

  3. Bootstrap 字体图标(Glyphicons)

    http://www.runoob.com/bootstrap/bootstrap-glyphicons.html 什么是字体图标? 字体图标是在 Web 项目中使用的图标字体.虽然,Glyphico ...

  4. yml中driver-class-name: com.mysql.jdbc.Driver 解析不到的问题

    当在idea中使用springboot的快捷创建方式时,选中了mysql 和jdbc 那么pom文件中会直接有 <dependency> <groupId>mysql</ ...

  5. 如何建立一个WCF服务并将其发布到IIS上

    在我们的软件开发中,经常会连接到数据库中,如果是常规的操作,我们经常会将连接数据库的字符串写在配置文件中,然后去读取数据库的连接字符串,其实这种方式是非常不科学的,这会直接暴露我们的数据库,直接暴露我 ...

  6. Maven 项目 查找指定包的引用位置

  7. 使用urllib2+re爬取web网站

    应用1,使用urllib2+re爬取淘宝网指定页面的所有图片

  8. 生存模型(Survival Model)介绍

    https://www.cnblogs.com/BinbinChen/p/3416972.html 生存分析,维基上的解释是: 生存分析(Survival analysis)是指根据试验或调查得到的数 ...

  9. opencv imdecode和imencode用法

    主要是对内存数据自动编解码 string fname = "D:/image.jpg"; //! 以二进制流方式读取图片到内存 FILE* pFile = fopen(fname. ...

  10. CSS3 flexbox 布局 ---- flex 容器属性介绍

    flexbox布局是CSS3中新增的属性,它可以很轻松地帮我们解决掉一些常见的布局问题,比如导航栏. 我们用普通的方法写导航栏,通常会在ul, li 结构写好后,让li 元素左浮动,然后再给ul 清浮 ...