题意

给出一个数 \(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. 牛客练习赛B题 筱玛的排列(找递推规律)

    链接:https://ac.nowcoder.com/acm/contest/342/B来源:牛客网 筱玛的排列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...

  2. 钢琴培训班课程、课时及费用管理系统已提供ACM3.0新版下载

    中小型艺术培训班课程.课时及费用管理系统. 2014新版 ACM3测试版下载:http://www.cnblogs.com/Charltsing/p/ACM3.html 您有任何功能需求,欢迎QQ 5 ...

  3. Mysql 索引问题集锦

    一.Mysql 中的索引 索引:顾名思义用来检索.查找数据的key (字段) 几种Mysql 中的常见索引分类:普通索引(联合索引).唯一索引.主键索引.全文索引 优点:使得查询数据变快 缺点:更新数 ...

  4. RabbitMQ防止消息丢失

    转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(3)— 消息的交换 1.简介 RabbitMQ中,消息丢失可以简单的分为 ...

  5. Redis缓存用起来

    Redis缓存用起来 1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择.我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户 ...

  6. Linux 典型应用之WebServer 安装和配置

    Apache的基本操作 安装 yum install httpd 启动 service httpd start  在浏览器中输入以下Ip 发现无法访问 http://192.168.1.109/ 输入 ...

  7. ORACLE 当字段中有数据如何修改字段类型

    创建视图的时候,因为表太多,里面一些字段类型不一样,PL/SQL报错,为‘表达式必须具有对应表达式相同的数据类型’,发现后,一个字段的类型为CLOB和VARCHAR2(4000)两种,将CLOB进行修 ...

  8. PHP中对象是按值传递还是按引用传递?

    1.首先,什么是按值传递和按引用传递? 按值传递就是仅仅把值传递过去,相当于传递的是值的拷贝,而按引用传递传递的是内存的地址. 在 PHP5 中,如果按引用传递,就是将 zval 的地址赋给另一个变量 ...

  9. Latex常用

    插入罗马数字 \newcommand{\RNum}[1]{\uppercase\expandafter{\romannumeral #1\relax}} 然后在正文里面就可以用\RNum{}来添加罗马 ...

  10. Day 5-7 exec 和元类的创建.

    exec方法 元类 exec(str_command,globals,locals)参数1:字符串形式的命令参数2:全局作用域(字典形式). 如果不指定,默认globals参数3:局部作用(字典形式) ...