您的位置:首页 > 其它

【数学题/化简分数】HDU 4139

2012-02-28 12:45 309 查看
简单的数学题,化简分数,做法是分别记录分子和分母的素因子个数,分子的加1,分母的加-1,这样最后个数为0的就代表已经约去,有个小优化,找一个数的素因子的时候用上,快了300ms....Orz,具体看代码

#define N 1000005
int max(int a,int b){return a>b?a:b;}
LL cnt
;
void gao(int n,int p){
int i;
int a=1;
for(i=2;i*i<=n;i+=a,a=2){//加一个小优化,可以省下300ms,因为素因子中除了2,3相差1之外其它都至少相差2
if(n%i==0){
while(n%i==0){
cnt[i] += p;
n/=i;
}
}
}
if(n>1)cnt
+= p;
}
int main(){
int t;
scanf("%d",&t);
int ca=1;
while(t--){
int n,m;
scanf("%d%d",&n,&m);
int i,j;
int a,b;
memset(cnt,0,sizeof(cnt));
int maxm = 0;
for(i=0;i<n;i++){
scanf("%d",&a);
maxm = max(a,maxm);
gao(a,1);
}
for(j=0;j<m;j++){
scanf("%d",&b);
maxm = max(b,maxm);
gao(b,-1);
}
int x = 1,y = 1;
for(i=2;i<=maxm;i++){
if(cnt[i] > 0){
while(cnt[i]--){
x *= i;
}
} else if(cnt[i]<0){
while(cnt[i]++){
y *= i;
}
}
}
printf("Case #%d: %d / %d\n",ca++,x,y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: