求n以內的所有因子數
阿新 • • 發佈:2019-01-27
在網上搜到的都是些求質因子的,剛好今天遇到一道題,題目思路錯了,就碼了一個求一個數所有因子的模板。
再根據公式n=p1^x1*p2^x2……pm^xm,pi表示質因子數,xi表示其指數,從而可以看出n的所有因子都是可以通過質因子組合而來,並且有n的因子個數等於(x1+1)*(x2+1)*……(xm+1)
所以該模板的複雜度為o(√n)+因子數
#include<cstdio> #include<cstring> #include<map> #include<stdlib.h> using namespace std; int fac[5000001]; int cou[5000001]; map<long long,int> mp; map<long long,int> ::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; }