在网上搜到的都是些求质因子的,刚好今天遇到一道题,题目思路错了,就码了一个求一个数所有因子的模板。
再根据公式n=p1^x1*p2^x2……pm^xm,pi表示质因子数,xi表示其指数,从而可以看出n的所有因子都是可以通过质因子组合而来,并且有n的因子个数等于(x1+1)*(x2+1)*……(xm+1)
所以该模板的复杂度为o(√n)+因子数
#include #include #include #include using namespace std; int fac[5000001]; int cou[5000001]; map mp; map ::iterator it; //第几个数,该数第几个,总共多少个数 ,是否组合数 void dfs(int cur,int n,long long num){ if(cur>=n) return; dfs(cur+1,n,num); for(int i=1;i<=cou[cur];i++){ num*=fac[cur]; if(mp.count(num)==0){ mp[num]=1; dfs(cur+1,n,num); } } } void getfac(long long temp){//得出质因子与其个数 int n=0; fac[n]=1; cou[n++]=1; for(int i=2;i*i<=temp;i++){ if(temp%i==0){ fac[n]=i; cou[n]=1; temp/=i; while(temp%i==0){ cou[n]++; temp/=i; } n++; } } if(temp!=1){ fac[n]=temp; cou[n]=1; n++; } mp.clear(); dfs(0,n,1); } void slove(long long num){ getfac(num); printf("%d\n",mp.size()); for(it=mp.begin();it!=mp.end();it++) printf("%I64d ",it->first); printf("\n"); } int main(void){ int num; while(1){ scanf("%I64d",&num); slove(num); } return 0; }