Bzoj3629--Jloi2014聪明的燕姿

蒟蒻不知道约数和公式。QAQ

然后自己手玩出来了,但是没去想DFS- -|

反正这篇博文也只是记录一下自己的愚蠢,代码就贴的是popoqqq神犇的代码。

顺便约数和公式  : 设n=p1^k1*p2^k2.....pn^kn , D_sum(n) = (p1^0+p1^1+..+p1^k1)*(p2^0+p2^1+....+p2^k2)*...*(pn^0+pn^1+..+pn^n)

代码:

#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm>  
#define M 100100  
using namespace std;  
typedef long long ll;  
ll n,p[M],ans[M],tot;  
bool not_prime[M];  
void Get_Prime()  
{  
    int i,j;  
    for(i=2;i<=100000;i++)  
    {  
        if(!not_prime[i])  
            p[++p[0]]=i;  
        for(j=1;p[j]*i<=100000&&j<=p[0];j++)  
        {  
            not_prime[p[j]*i]=1;  
            if(i%p[j]==0)  
                break;  
        }  
    }  
}  
bool Judge_Prime(ll x)  
{  
    ll i;  
    if(x==1)  
        return 0;  
    for(i=1;p[i]*p[i]<=x;i++)  
        if(x%p[i]==0)  
            return 0;  
    return 1;  
}  
void DFS(ll now,int pos,ll left)  
{  
    int i;  
    if(left==1)  
    {  
        ans[++ans[0]]=now;  
        return ;  
    }  
    if( left-1>=p[pos] && Judge_Prime(left-1) )  
        ans[++ans[0]]=(left-1)*now;  
    for(i=pos; p[i]*p[i]<=left ;i++)  
    {  
        ll power_sum=p[i]+1,power=p[i];  
        for(;power_sum<=left;power*=p[i],power_sum+=power)  
            if(left%power_sum==0)  
                DFS(now*power,i+1,left/power_sum);  
    }  
}  
int main()  
{  
    int i;
    Get_Prime();  
    while(~scanf("%lld",&n))  
    {  
        ans[0]=0;tot=0;  
        DFS(1,1,n);  
        sort(ans+1,ans+ans[0]+1);  
        cout<<ans[0]<<endl;  
        for(i=1;i<=ans[0];i++)  
            printf("%lld%c",ans[i],i==ans[0]?'\n':' ');
    }  
}

 

posted @ 2016-10-14 10:59  ihopenot  阅读(263)  评论(0编辑  收藏  举报