给出数 $n$
记 $f(x)$ 表示 $x$ 的因子和
求出所有 $x$ 使得 $f(x) = n$
考虑 $x = p_1 ^{a_1} * p_2 ^ {a_2} * \cdots * p_k ^ {a_k}$
那么 $f(x) = (1 + p_1 + p_1 ^ 2 + \cdots + p_1 ^ {a_1}) * (1 + p_2 + p_2 ^ 2 + \cdots + p_2 ^ {a_2}) * \cdots * (1 + p_k + p_k

^ 2 + \cdots + p_k ^ {a_k})$
因此可以爆搜枚举 $p, a$
Dfs(Now_result, prime_pos, x_remind) {}
分别表示
1.当前结果,即枚举到的素数的指数次幂的乘积,即 $p_i ^ {a_i}$ 的乘积 
2.当前枚举到的素数位置 首先要求出 $1e5, \sqrt(limit)$ 内的素数
3.给出的 $x$ 在枚举了之前的数后还剩多少
对于答案的录入
1.如果 x_remind = 1 ,相当于枚举到了这样一种形式 $() * () * () * p_i ^ 0$, 显然当前 Now_result 可以录入.
2.如果 x_remind - 1 是一个 大于等于 Prime[Prime_pos] 的素数,显然 (x_remind - 1) * Now_result 可以录入.
考虑这样的话我们已经枚举到了这样的一种形式 $() * () * () * (p_i + 1)$, 所以还原之前的数就是 p_i * Now_result.

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring> using namespace std; #define gc getchar() inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} const int N = 1e5 + ; #define LL long long LL Prime[N], Mark[N], Ans_js;
LL Answer[N], tot, n; void Get_prime() {
for(int i = ; i <= N - ; i ++) {
if(!Mark[i]) Prime[++ tot] = i;
for(int j = ; j <= tot && Prime[j] * i < N; j ++) {
Mark[Prime[j] * i] = ;
if(i % Prime[j] == ) break;
}
}
} bool Is_prime(LL x) {
if(x == ) return ;
for(int i = ; Prime[i] * Prime[i] <= x; i ++) {
if(x % Prime[i] == ) return ;
}
return ;
} void Dfs(LL Now_result, int prime_pos, LL x_remind) {
if(x_remind == ) {
Answer[++ Ans_js] = Now_result;
return ;
}
if(x_remind - >= Prime[prime_pos] && Is_prime(x_remind - )) {
Answer[++ Ans_js] = (x_remind - ) * Now_result;
}
for(int i = prime_pos; Prime[i] * Prime[i] <= x_remind; i ++) {
for(LL tmp = Prime[i] + , imp = Prime[i]; tmp <= x_remind; imp *= Prime[i], tmp += imp) {
if(x_remind % tmp == ) Dfs(Now_result * imp, i + , x_remind / tmp);
}
}
} int main() {
Get_prime();
while(scanf("%lld", &n) == ) {
Ans_js = ;
Dfs(, , n);
sort(Answer + , Answer + Ans_js + );
cout << Ans_js << "\n";
for(int i = ; i < Ans_js; i ++) cout << Answer[i] << " ";
if(Ans_js) cout << Answer[Ans_js] << "\n";
}
return ;
}

bzoj 3629的更多相关文章

  1. bzoj 3629 [JLOI2014]聪明的燕姿(约数和,搜索)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3629 [题意] 给定S,找出所有约数和为S的数. [思路] 若n=p1^a1*p2^a ...

  2. bzoj 3629 [JLOI2014]聪明的燕姿——约数和定理+dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3629 如果要搜索,肯定得质因数分解吧:就应该朝这个方向想. **约数和定理: 对于任意一个大 ...

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

    这道题考试选择打表,完美爆零.. 算数基本定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数, ...

  4. bzoj 3629 聪明的燕姿 约数和+dfs

    考试只筛到了30分,正解dfs...... 对于任意N=P1^a1*P2^a2*......*Pn^an, F(N)=(P1^0+P1^1+...+P1^a1)(P2^0+P2^1+...+P2^a2 ...

  5. BZOJ 3629 JLOI2014 聪明的燕姿 约数和+DFS

    根据约数和公式来拆s,最后再把答案乘出来,我们发先这样的话递归层数不会太大每层枚举次数也不会太多,然而我们再来个剪枝就好了 #include<cstdio> #include<ios ...

  6. bzoj 3629: [JLOI2014]聪明的燕姿【线性筛+dfs】

    数论+爆搜 详见这位大佬https://blog.csdn.net/eolv99/article/details/39644419 #include<iostream> #include& ...

  7. BZOJ 3629 约数和定理+搜索

    呃呃 看到了这道题 没有任何思路-- 百度了一发题解 说要用约数和定理 就查了一发 http://baike.so.com/doc/7207502-7432191.html (不会的可以先学习一下) ...

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

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

  9. 【BZOJ】初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

    BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Le ...

随机推荐

  1. TZOJ3114: {A}∩{B}

    #include<stdio.h> int main() { ],b[],m,i,j,c; scanf("%d",&t); while(t--) { c=; s ...

  2. Windows上安装配置SSH教程(1)

    作者:feipeng8848 出处:https://www.cnblogs.com/feipeng8848/p/8559803.html 本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位 ...

  3. 网易自动化测试工具(airtest)的环境部署

    airtest 环境配置: 1.安装Python2.7 及 Python3.6 版本(2个需要都安装) 2.配置python环境变量(AirtestIDE 需要在python2.x的环境下运行,所以尽 ...

  4. Java基础IO类之数据流

    DataInputStream: 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本java数据类型.应用程序可以使用数据输出流 写入稍后由数据输入流读取的数据.DataInputStrea ...

  5. 解决git下载很慢的问题

    通过官网在下载git的时候发现网速只有几十K,淘宝有一个镜像的网站 可以提供下载https://npm.taobao.org/mirrors/git-for-windows/

  6. 日常hive遇到的问题

    1 hive中的复杂数据类型数据如何导入(array) 创建hive表 create table temp.dws_search_by_program_set_count_his( program_s ...

  7. 基于【 建造者模式】一 || 网关zuul过滤器封装

    一.springcloud的zuul网关拦截 1.黑名单拦截 2.参数验签 3.Api接口权限验证 二.网关拦截实现方式 1.继承ZuulFilter方法,实现业务逻辑 @Component @Slf ...

  8. .NET 对文件和文件夹操作的介绍

    1 Directory和File类只包含静态方法,不能被实例化 2 DirectoryInfo和FileInfo他们是有状态的,需要被实例化 //构造函数初始化一个文件的路径 FileInfo myF ...

  9. Lwip与底层的接口

    Lwip有三套api,分别是: raw api:使用方法为使用回调函数,即先注册一个函数,当接受到数据之后调用这个函数.缺点是对于数据连续处理不好. Lwip api:把接收与处理放在一个线程里面.因 ...

  10. 理解JVM之类加载机制

    类完整的生命周期包括加载,验证,准备,解析,初始化,使用,卸载,七个阶段.其中验证,准备,解析统称为连接,类的卸载在前面的关于垃圾回收的博文中已经介绍. 加载,验证,准备,初始化,卸载这五个阶段的顺序 ...