推式子没推出来什么特别有用的结论. 

看题解后发现这尼玛就是一个大爆搜啊. 

以后碰到这种推式子推不出来,或者没啥思路的时候可以考虑爆搜解决. 

code: 

#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>

#define N 50001
#define ll long long
#define MAX 2000000009

using namespace std;

namespace IO {
    void setIO(string s)
    {
        string in=s+".in";
        string out=s+".out";
        freopen(in.c_str(),"r",stdin);
        // freopen(out.c_str(),"w",stdout);
    }
};

int cnt;
int prime[N],vis[N];

int isprime(int x)
{
    if(x<N) return !vis[x];
    for(int i=2;i*i<=x;++i)
        if(x%i==0)  return 0;
    return 1;
}

void Initialize()
{
    int i,j;
    for(i=2;i<N;++i)
    {
        if(!vis[i]) prime[++cnt]=i;
        for(j=1;j<=cnt&&prime[j]*i<N;++j)
        {
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)  break;
        }
    }
}

int cn;
int answer[N];

void dfs(int S,int cur,int num)
{
    if(S==1)
    {
        answer[++cn]=num;
        return;
    }
    if(S-1>=prime[cur]&&isprime(S-1))
    {
        answer[++cn]=num*(S-1);
    }
    for(int i=cur;prime[i]*prime[i]<=S;++i)
    {
        int tmp=1+prime[i];
        int now=prime[i];
        for(;tmp<=S;now*=prime[i],tmp+=now)
        {
            if(S%tmp==0) dfs(S/tmp,i+1,num*now);
        }
    }
}

int main()
{
   // IO::setIO("input");
    Initialize();
    int i,j,S;
    while(scanf("%d",&S)!=EOF)
    {
        cn=0;
        dfs(S,1,1);
        printf("%d\n",cn);
        sort(answer+1,answer+1+cn);
        for(i=1;i<cn;++i)  printf("%d ",answer[i]);
        if(cn)  printf("%d\n",answer[cn]);
    }
    return 0;
}

  

12-13 08:49
查看更多