BZOJ 3629 约数和定理+搜索

来源:互联网 发布:php新闻发布系统登录 编辑:程序博客网 时间:2024/05/21 18:42

呃呃
看到了这道题 没有任何思路…… 百度了一发题解 说要用约数和定理
就查了一发
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 100000int 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\n",cnt);        for(int i=1;i<=cnt;i++){            printf("%d",Ans[i]);            if(i!=cnt)putchar(' ');        }        if(cnt)puts("");    }}

这里写图片描述

0 0
原创粉丝点击