您的位置:首页 > 其它

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求因子个数超时了=。=

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: