zoukankan      html  css  js  c++  java
  • BZOJ_3629_[JLOI2014]聪明的燕姿_dfs

    BZOJ_3629_[JLOI2014]聪明的燕姿_dfs

    Description

    阴天傍晚车窗外
    未来有一个人在等待
    向左向右向前看
    爱要拐几个弯才来
    我遇见谁会有怎样的对白
    我等的人他在多远的未来
    我听见风来自地铁和人海
    我排着队拿着爱的号码牌
    城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字S,那么自己等的人手上的号码牌数字的所有正约数之和必定等于S。
    所以燕姿总是拿着号码牌在地铁和人海找数字(喂!这样真的靠谱吗)可是她忙着唱《绿光》,想拜托你写一个程序能够快速地找到所有自己等的人。

    Input

    输入包含k组数据(k<=100)对于每组数据,输入包含一个号码牌S

    Output

    对于每组数据,输出有两行,第一行包含一个整数m,表示有m个等的人,第二行包含相应的m个数,表示所有等的人的号码牌。注意:你输出的号码牌必须按照升序排列。

    Sample Input

    42

    Sample Output

    3
    20 26 41

    HINT

    对于100%的数据,有S<=2*10*9


    首先有约数和公式:

    $sigma(n)=(p_{1}^0+p_{1}^1+p_{1}^2+…p_{1}^{k1})
    (p_{2}^0+p_{2}^1+p_{2}^2+…p_{2}^{k2})…(p_{w}^0+p_{w}^1+p_{w}^2+…p_{w}^{kw})$

    我们先筛出$sqrt(n)$以内的质数,然后枚举每个质数的幂数进行搜索,但这样可能有一些大质数被漏掉了。

    于是需要每次检查一下S除剩下来的数是不是质数。

    再加上一些剪枝就过掉啦。

    代码:

    /**************************
    orz popoqqq
    ***************************/
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <map>
    using namespace std;
    #define maxn 2000000000
    typedef long long ll;
    int prime[50005],cnt,vis[100050];
    int n;
    ll ans[1000050];
    void init() {
        int i,j;vis[1]=1;
        for(i=2;i<=100000;i++) {
            if(!vis[i]) {
                prime[++cnt]=i;
            }
            for(j=1;j<=cnt&&i*prime[j]<=100000;j++) {
                vis[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    bool judge(ll x) {
        if(x<=100000) return !vis[x];
        int i;
        for(i=1;1ll*prime[i]*prime[i]<=x;i++) if(x%prime[i]==0) return 0;
        return 1; 
    }
    void dfs(int dep,ll num,ll lft) {
        if(lft==1) {
            ans[++ans[0]]=num; return ;
        }
        if(lft-1>=prime[dep]&&judge(lft-1)) {
            ans[++ans[0]]=(lft-1)*num;
        }
        int i;
        for(i=dep;prime[i]*prime[i]<=lft;i++) {
            ll re=prime[i]+1,po=prime[i];
            for(;re<=lft;po*=prime[i],re+=po) {
                if(lft%re==0) {
                    dfs(i+1,num*po,lft/re);
                }
            }
        }
    }
    int main() {
        init();
        while(scanf("%d",&n)!=EOF) {
            ans[0]=0; dfs(1,1,n);
            sort(ans+1,ans+ans[0]+1);
            int i;printf("%lld
    ",ans[0]);
            if(ans[0]){for(i=1;i<=ans[0];i++) printf("%lld ",ans[i]); puts("");}
        }
    }
    
  • 相关阅读:
    HDU 5441——Travel——————【并查集+二分查界限】
    HDU 5446——Unknown Treasure——————【CRT+lucas+exgcd+快速乘+递推求逆元】
    HDU 5407——CRB and Candies——————【逆元+是素数次方的数+公式】
    HDU 5412——CRB and Queries——————【线段树套Treap(并没有AC)】
    HDU 4336——Card Collector——————【概率dp】
    HDU 5419——Victor and Toys——————【线段树|差分前缀和】
    使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
    使用 JAX-RS 简化 REST 应用开发
    [置顶] 智能家居开源项目 The open Home Automation Bus (openHAB)
    ThoughtWorks 技术雷达(2013年5月)
  • 原文地址:https://www.cnblogs.com/suika/p/8996327.html
Copyright © 2011-2022 走看看