题意

给出一个数 \(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. 广州商学院16级软工一班&二班-第二次作业成绩

    作业地址 https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 https://edu.cnblogs.com/campus/gzc ...

  2. 阿里字体css代码引入方法

    1.第一步,选择自己想要的图标字体,添加入库. 2.选择下载代码. 3.我们可以发现,有如下的代码被下载下来了. 4.我们选择iconfont.css放到自己的文件夹中. 5.然后我们根据下载下来ht ...

  3. RabbitMQ消息的交换

    消息的交换 目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(2)— 防止消息丢失 1.简介 在前面的例子中,每个消息都只对应一个消费者,即使 ...

  4. 开发环境搭建(lnmp)

    我们的开发环境一般现在时用Linux + Nginx + MySQL(mariaDB) + PHP的组合进行项目的搭建与开发,工欲善其事必先利其器. 搭建环境: Centos7 + mysql5.6 ...

  5. emplace与insert的区别(C++11)

    转自时习之 C++11中大部分的容器对于添加元素除了传统的 insert 或者 pusb_back/push_front 之外都提供一个新的函数叫做 emplace. 比如如果你想要向 std::ve ...

  6. 网络编程--使用UDP发送接收数据

    package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...

  7. Oracle转换函数

    ()--转换函数 --数字转换字符串 )||'分' from dual; ||'' from dual; ()--日期转字符串 select to_char(sysdate,'yyyy-mm-dd') ...

  8. C# Note7:MVVM模式之数据绑定

    一.资源说明 (1)本文参考自: 一步步走进WPF的MVVM模式(二):数据绑定 WPF之数据绑定总结 二.正文  数据绑定 (Data Binding)是WPF最重要的特性之一,也是实现 MVVM( ...

  9. Numpy中array数据操作

    1.创建: import numpy as np arr=np.array([1,2,3]) print(arr,arr.ndim) list=[1,2,3] arr=np.array(list) 2 ...

  10. DAY05、基本数据类型与内置方法

    一.可变类型与不可变类型: 1.可变类型:值改变,但是id不变 2.不可变类型:值改变,id也改变 二.数据类型: 1.数字类型: 1.1:整型int: 用途:记录年龄.等级.数量 定义方式:age ...