POJ 2603 Brave Balloonists

    技术2022-05-19  18

    求10个数的乘积的因子个数

    把10个数的乘积因式分解,得到p1^a1*p2^a2*...*pn^an

    因子个数为(1+a1)*(1+a2)*(1+a3)*...*(1+an)

    每个ai,它的取值可能为[0,ai],共有ai+1种取法

     

    我用dfs求因子个数超时了=。=

     

    代码:

    #include<iostream> #include<cstdio> #include<memory.h> #include<algorithm> using namespace std; struct node { int p,a; bool operator < (const node &x) const { return x.p<p; } }prime[10000]; int f[10000],e[10000]; int cnt,f_num,ans; void split(int x) { for(int i=2;i*i<=x;i++) { if(x%i==0) { prime[cnt].p=i; prime[cnt].a=0; while(x%i==0) { x/=i; prime[cnt].a++; } cnt++; } } if(x>1) { prime[cnt].p=x; prime[cnt++].a=1; } } void dfs(int val,int d) { if(d==f_num) { ans=(ans+1); return; } int sum=1,i; for(i=1;i<=e[d];i++) { sum*=f[d]; dfs(val*sum,d+1); } dfs(val,d+1); } int main() { int i,j; cnt=0; for(i=1;i<=10;i++) { scanf("%d",&j); split(j); } sort(prime,prime+cnt); /*if(cnt==0) { puts("1"); return 0; }*/ //cout<<cnt<<endl; f[0]=prime[0].p; e[0]=prime[0].a; for(i=1,f_num=0;i<cnt;i++) { if(prime[i].p!=prime[i-1].p) { f[++f_num]=prime[i].p; e[f_num]=prime[i].a; } else e[f_num]+=prime[i].a; } f_num++; ans=1; //dfs(1,0); for(i=0;i<f_num;i++) ans=ans*(1+e[i]); cout<<ans<<endl; return 0; } 


    最新回复(0)