一直超时...已经尽可能优化了,但其实是对于题目的理解还不够深刻(本人数学辣鸡)
尽管我试图通过记忆化来缩短时间,但是大量的遍历会占用非常多的时间,这也是超时的原因所在,那么有没有更优解呢?
大胆点
不用遍历直接找到呢?
答案是有的
第一版本:
#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;
}