zoukankan      html  css  js  c++  java
  • BZOJ 3629 约数和定理+搜索

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

    然后呢 我们考虑枚举约数
    先线性筛一遍10^5以下的 10^5以上的数可以用已经筛过的素因数枚举

    最后就搜一下就好了 (记得判断=1的情况)

    还有 此题PE很坑爹

    不能有行末空格 0的情况不用输出空行

    //By SiriusRen
    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    #define N 100000
    int s,cnt,pri[N],Ans[N];
    bool p[N+5];
    void get_prime(){
        for(int i=2;i<=N;i++){
            if(!p[i])pri[++cnt]=i;
            for(int j=1;j<=cnt&&i*pri[j]<=N;j++){
                p[i*pri[j]]=1;
                if(i%pri[j]==0)break;
            }
        }
    }
    bool is_prime(int x){
        if(x<=N)return !p[x];
        int temp=sqrt(x);
        for(int i=1;pri[i]<=temp;i++)
            if(x%pri[i]==0)return 0;
        return 1;
    }
    void dfs(int last,int ans,int sum){
        if(sum==1){Ans[++cnt]=ans;return;}
        if(sum-1>pri[last]&&is_prime(sum-1))Ans[++cnt]=ans*(sum-1);
        for(int i=last+1;pri[i]*pri[i]<=sum;i++)
            for(int psum=pri[i]+1,div=pri[i];psum<=sum;div*=pri[i],psum+=div)
                if(sum%psum==0)dfs(i,ans*div,sum/psum);
    }
    int main(){
        get_prime();
        while(~scanf("%d",&s)){
            cnt=0,dfs(0,1,s);
            sort(Ans+1,Ans+1+cnt);
            printf("%d
    ",cnt);
            for(int i=1;i<=cnt;i++){
                printf("%d",Ans[i]);
                if(i!=cnt)putchar(' ');
            }
            if(cnt)puts("");
        }
    }

    这里写图片描述

  • 相关阅读:
    Spring代理模式
    Spring注解的步骤
    Spring与Struts2集成开发
    Spring框架之控制反转和依赖注入
    使用Spring框架的步骤
    Hibernate锁机制
    Hibernate的缓存机制
    Hibernate框架之HQL查询与Criteria 查询的区别
    Hibernate框架之Criteria 详解
    Ajax异步刷新省市级联
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532249.html
Copyright © 2011-2022 走看看