LOJ #2234. 「JLOI2014」聪明的燕姿(搜索 + 数论)
题意
给出一个数 \(S\) ,输出所有约数和等于 \(S\) 的数。
\(S \le 2 \times 10^9\) ,数据组数 \(\le 100\) 。
题解
首先用约数和定理:
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」聪明的燕姿(搜索 + 数论)的更多相关文章
- 「JLOI2014」聪明的燕姿
传送门 Luogu 解题思路 很容易想到直接构造合法的数,但是这显然是会T飞的. 我们需要考虑这样一件事: 对于一个数 \(n\),对其进行质因数分解: \[n=\sum_{i=1}^x p_i^{c ...
- LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)
题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...
- Loj#6434「PKUSC2018」主斗地(搜索)
题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\( ...
- BZOJ3629(JLOI2014)聪明的燕姿
(⊙﹏⊙)我交了好久,有坑啊...(如果没有匹配的话,即输出0种情况要记得换行...) 就是搜索,加上一点数论,并不太难... #include<cstdio> #include<c ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- Loj #2529. 「ZJOI2018」胖
Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...
- BZOJ_3629_[JLOI2014]聪明的燕姿_dfs
BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
随机推荐
- 微服务治理平台的RPC方案实现
导读:本文主要探讨了rpc框架在微服务化中所处的位置,需要解决的问题.同时介绍了用友云微服务治理平台的rpc解决方案,为什么选择该方案.该方案提供的好处是什么.同时也会介绍用友RPC框架的基本结构以及 ...
- jQuery实现Ajax请求时,页面显示等待的效果,超过指定请求时间后,进行其他操作
背景:有一个按钮,点击之后向后端程序发起Ajax请求,在请求结果没有返回之前,页面显示等待的效果,此时仍旧是异步请求,等待的效果在接收到结果后撤销. 需求:因为网络延迟或者后端程序的问题,在发起Aja ...
- vue路由动态过渡效果
不多说,直接上代码 import Vue from 'vue' //引入vue import VueRouter from 'vue-router' //引入路由 Vue.use(VueRouter) ...
- Oracle Profile 配置文件
Profile是用户的配置文件,它是密码限制,资源限制的命名集合.利用profile 可以对数据库用户进行基本的资源管理,密码管理. 1 创建profile 的语法 create profile pr ...
- 运行Spark-shell,解决Unable to load native-hadoop library for your platform
启动spark后,运行bin/spark-shell会出现一个警告 提君博客原创 WARN util.NativeCodeLoader: Unable to load native-hadoop li ...
- 转《JavaScript中的图片处理与合成》
引言: 本系列现在构思成以下4个部分: 基础类型图片处理技术之缩放.裁剪与旋转(传送门): 基础类型图片处理技术之图片合成(传送门): 基础类型图片处理技术之文字合成(传送门): 算法类型图片处理技术 ...
- MVC最全jar包
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> & ...
- python学习笔记(10)--组合数据类型(集合类型)
集合类型 集合是多个元素的无序组合,每个元素唯一,不存在相同类型,每个元素是不可变类型.用{}表示,元素间用逗号分隔.建立结合类型用{},或set函数,如果是空集合必须用set. >>&g ...
- pip 安装 MySQL-python 报错
报错一:EnvironmentError: mysql_config not found 解决:yum install mysql-devel 报错二:Python.h No such file or ...
- 魔术方法:__set、__get
__set: 在设置对象里边不能直接设置(或没有)的属性值的时候,自动去被调用 class Track { private $track_name; public function __set($na ...