当前位置: 代码迷 >> 综合 >> XTU OJ 1352 Fraction
  详细解决方案

XTU OJ 1352 Fraction

热度:9   发布时间:2023-12-04 21:37:05.0

一直超时...已经尽可能优化了,但其实是对于题目的理解还不够深刻(本人数学辣鸡)

尽管我试图通过记忆化来缩短时间,但是大量的遍历会占用非常多的时间,这也是超时的原因所在,那么有没有更优解呢?

大胆点

不用遍历直接找到呢?

答案是有的

第一版本:

#include<stdio.h>
int Gcd(int x,int y){return y ? Gcd( y ,x % y) : x ;
}
int num[1000];
/*
3
1 2
2 3
3 7
*/int main()
{int n;scanf("%d",&n);while(n--){int a,b;scanf("%d %d",&a,&b);int zi,mu;zi=a;mu=b;if(a==1){printf("%d\n",b);}else{int cnt=0;int s,temp=1;for(int i=temp;i<=1e9;i++){if(zi*i>=mu){zi=zi*i-mu;num[cnt]=i;cnt++;mu*=i;s=Gcd(zi,mu);zi/=s;mu/=s;temp=i;}if(zi==0) 	break;else 		continue;}for(int i=0;i<cnt;i++){printf("%d",num[i]);if(i<cnt-1) printf(" "); }printf("\n");for(int i=0;i<=cnt;i++) num[i]=0;}}return 0;
}

第二版本:在巨佬的点拨下找到了优化的方法

#include<stdio.h>
typedef long long ll;
ll Gcd(ll x,ll y){return y ? Gcd( y ,x % y) : x ;
}
/*
3
1 2
2 3
3 7
*/int main()
{int n;scanf("%d",&n);while(n--){ll a,b;scanf("%lld %lld",&a,&b);ll zi,mu;zi=a;mu=b;for(;;){if(zi==1){printf("%lld\n",mu);break;}else{ll temp=zi,s=mu/zi+1;//个人感觉这一步是精髓,极大简化了计算printf("%lld ",s);zi=zi*s-mu;mu*=s;			ll p=Gcd(zi,mu);mu/=p;zi/=p;			}}}return 0;
}