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':' '); } }