这道题考试选择打表,完美爆零。。

算数基本定理:

任何一个大于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 ]聪明的燕姿的更多相关文章

  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 聪明的燕姿 约数和+DFS

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

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

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

  5. BZOJ_3629_[JLOI2014]聪明的燕姿_dfs

    BZOJ_3629_[JLOI2014]聪明的燕姿_dfs Description 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 ...

  6. bzoj3629 / P4397 [JLOI2014]聪明的燕姿

    P4397 [JLOI2014]聪明的燕姿 根据唯一分解定理 $n=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$ 而$ ...

  7. P4397 [JLOI2014]聪明的燕姿

    P4397 [JLOI2014]聪明的燕姿 题目背景 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排 ...

  8. 【LG4397】[JLOI2014]聪明的燕姿

    [LG4397][JLOI2014]聪明的燕姿 题面 洛谷 题解 考虑到约数和函数\(\sigma = \prod (1+p_i+...+p_i^{r_i})\),直接爆搜把所有数搜出来即可. 爆搜过 ...

  9. [JLOI2014]聪明的燕姿(搜索)

    城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁. 可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字 S, ...

随机推荐

  1. react-router 踩坑记

    react-router踩坑分享 背景 辛苦历程 JavaScript动态修改 第一次尝试 第二次尝试 第三次尝试 第四次尝试 总结步骤 其他方案 原理 History 常见的3种History Br ...

  2. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  3. Oracle的用户、角色以及权限相关操作

    1.创建用户create user KD identified by 123456;2.授予连接数据库的权限grant connect to KD;3.将Scott用户的emp表授权给KD可以查询gr ...

  4. 页面异步请求会保留原有的js内容

    最近在开发前端的时候发现一个问题,这个问题应该是很多前端开发人员都容易忽视的一个问题,但却是一个很重要的问题. 就是在开发一个页面的时候,在使用某个函数时,这个函数可以正常使用,便会认为这个页面中定义 ...

  5. CodeM美团点评编程大赛复赛 做题感悟&题解

    [T1] [简要题意]   长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...

  6. usaco 2002 月赛 Chores 题解

    Description Farmer John's family pitches in with the chores during milking, doing all the chores as ...

  7. usaco 2002 月赛 Fiber Communications 题解

    Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...

  8. 原生JS的HTTP请求

    ar xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if( xhr.readyState == 4){ if( xh ...

  9. Java 数据类型在实际开发中应用

    在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...

  10. 流畅python学习笔记:第十章:序列的修改,散列和切片

    前面在介绍了类的很多内置方法,比如__add__,__eq__,这里继续介绍类的两个内置方法,这2个内置方法可以将一个类实例变成一个序列的形式.代码如下 class vector(object):   ...