[BZOJ 3629][ JLOI2014 ]聪明的燕姿
这道题考试选择打表,完美爆零。。
算数基本定理:
任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数,其诸指数ai是正整数。
这样的分解称为N的标准分解式。
约数和定理:
对于任意一个大于1的正整数N可以分解正整数:N=P₁^a₁ P₂^a₂…Pn^an,则由约数个数定理可知N的正约数有(a₁+1)(a₂+1)(a₃+1)…(an+1)个,那么N的(a₁+1)(a₂+1)(a₃+1)…(an+1)个正约数的和为f(N)=(P₁^0+P₁^1+P₁^2+…P₁^a₁)(P₂^0+P₂^1+P₂^2+…P₂^a₂)…(Pn^0+Pn^1+Pn^2+…Pn^an)。
至此,搜索算法很显然地露出水面——穷举Pi及其对应的ai进行搜索。
具体解释:
题目给的n可以分解为多个式子的乘积,式子中是互不相同质数的幂依次增加的和(如上图黄色部分)。每个式子最高次幂那一项的数的乘积即为所得答案之一(如上图绿色部分)。它的所有正约数之和为题目给的
n。
在深搜时要注意:有两种情况:①最后分解完,剩余得1,将所得结果记录②分解剩余的数-1是一个质数p,这样就可以看成p^0+p^1,也可以得到结果,将其记录(代码中有标注)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define pos(i,a,b) for(int i=(a);i<=(b);i++) #define pos2(i,a,b) for(int i=(a);i>=(b);i--) #define ll long long #define N 100100 using namespace std; ll prime[N],ans[N],sum,n; bool notprime[N]; int cnt; void getprime()//预处理出所有素数 { pos(i,2,N) { if(!notprime[i]) prime[++cnt]=i; for(int j=1;j<=cnt&&prime[j]*i<N;j++) { notprime[prime[j]*i]=1; if(i%prime[j]==0) break; } } } bool judge(ll x)//判断是否为素数 { if(x==1) return 0; for(ll i=1;prime[i]*prime[i]<=x;i++) if(x%prime[i]==0) return 0; return 1; } void dfs(ll now,int pos,ll left)//深搜 ,now表示目前所得的结果,pos表示搜索素数的位置,left表示目前剩余的数 { if(left==1)//①处解释 { ans[++cnt]=now; return; } if(left-1>=prime[pos]&&judge(left-1))//②处解释 ans[++cnt]=(left-1)*now; for(int i=pos;prime[i]*prime[i]<=left;i++) { for(ll tmp=prime[i]+1,tt=prime[i];tmp<=left;tt*=prime[i],tmp+=tt) if(left%tmp==0) dfs(now*tt,i+1,left/tmp); } } int main() { getprime(); while(scanf("%lld",&n)==1) { memset(ans,0,sizeof(ans)); cnt=0; dfs(1,1,n); sort(ans+1,ans+cnt+1); printf("%d\n",cnt); pos(i,1,cnt-1) printf("%lld ",ans[i]); if(cnt) printf("%d\n",ans[cnt]); } while(1); return 0; }
[BZOJ 3629][ JLOI2014 ]聪明的燕姿的更多相关文章
- bzoj 3629 [JLOI2014]聪明的燕姿(约数和,搜索)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3629 [题意] 给定S,找出所有约数和为S的数. [思路] 若n=p1^a1*p2^a ...
- bzoj 3629 [JLOI2014]聪明的燕姿——约数和定理+dfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3629 如果要搜索,肯定得质因数分解吧:就应该朝这个方向想. **约数和定理: 对于任意一个大 ...
- BZOJ 3629 JLOI2014 聪明的燕姿 约数和+DFS
根据约数和公式来拆s,最后再把答案乘出来,我们发先这样的话递归层数不会太大每层枚举次数也不会太多,然而我们再来个剪枝就好了 #include<cstdio> #include<ios ...
- bzoj 3629: [JLOI2014]聪明的燕姿【线性筛+dfs】
数论+爆搜 详见这位大佬https://blog.csdn.net/eolv99/article/details/39644419 #include<iostream> #include& ...
- BZOJ_3629_[JLOI2014]聪明的燕姿_dfs
BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...
- bzoj3629 / P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 根据唯一分解定理 $n=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$ 而$ ...
- P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 题目背景 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排 ...
- 【LG4397】[JLOI2014]聪明的燕姿
[LG4397][JLOI2014]聪明的燕姿 题面 洛谷 题解 考虑到约数和函数\(\sigma = \prod (1+p_i+...+p_i^{r_i})\),直接爆搜把所有数搜出来即可. 爆搜过 ...
- [JLOI2014]聪明的燕姿(搜索)
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁. 可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S, ...
随机推荐
- Android混淆
一.为什么要混淆 为了避免apk在发布后被用户通过反编译拿到源代码和资源文件,然后修改资源和代码之后就变成一个新的apk.而经过混淆后的APK,即使被反编译,也难以阅读,注意混淆不是让apk不能阅读, ...
- [leetcode-630-Course Schedule III]
There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...
- JAVA基础——Arrays工具类十大常用方法
Arrays工具类十大常用方法 原文链接:http://blog.csdn.net/renfufei/article/details/16829457 0. 声明数组 String[] aArray ...
- 在ASP.NET Core配置环境变量和启动设置
在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...
- web前段学习2017.6.15
CSS---表现层,修饰和表现html文档,为了解决结构层和表现层分离的问题. 通过CSS极大的提高了工作效率,方便工作人员维护和管理CSS:层叠样式表,目前用的最广泛的css版本为css2,最新版本 ...
- usaco training 4.1.2 Fence Rails 题解
Fence Rails题解 Burch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of h ...
- (cljs/run-at (JSVM. :all) "细说函数")
前言 作为一门函数式编程语言,深入了解函数的定义和使用自然是十分重要的事情,下面我们一起来学习吧! 3种基础定义方法 defn 定义语法 (defn name [params*] exprs*) 示 ...
- Java 上传下载的
1.上传的步骤: a.导入SmartUpload.jar b.创建一个上传的类的对象 c.初始化 d.上传至服务器 e.保存 注意:表单提交时需要指定enctype=&quo ...
- java Semaphore的介绍和使用
一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...
- objc[20556]:Class JavaLaunchHelper is implemented in both xxx 警告处理
今天在Mac上对IntelliJ Idea 进行了升级 升级到2017.01后,运行程序时,出现以下红色警告: objc[20556]: Class JavaLaunchHelper is imple ...