POJ 2603 Brave Balloonists
2011-03-04 21:12
197 查看
求10个数的乘积的因子个数
把10个数的乘积因式分解,得到p1^a1*p2^a2*...*pn^an
因子个数为(1+a1)*(1+a2)*(1+a3)*...*(1+an)
每个ai,它的取值可能为[0,ai],共有ai+1种取法
我用dfs求因子个数超时了=。=
代码:
把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)%10; 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])%10; cout<<ans<<endl; return 0; }
相关文章推荐
- POJ 2603 Brave balloonists 笔记
- POJ 2603 Brave balloonists
- poj 2603 Brave balloonists
- pku2603--Brave balloonists
- POJ 2603
- poj 2603 注意理解题意 数论
- ural 1049 Brave Balloonists
- URAL:1049 Brave Balloonists
- 1049. Brave Balloonists
- Poj 2603 约数个数和
- PKU2603 brave ballonists
- POJ 2603 HDU 1963 Investment(完全背包)
- poj2603
- POJ 2603 Brave balloonists(素因子分解)
- Ural 1049. Brave Balloonists 求因子的个数
- POJ 2603
- POJ 2603
- Brave Balloonists
- URAL 1049 Brave Balloonists
- POJ 1953 继续体会DP的内涵