BIO 1997埃及分数
题目描述
然后来想怎么优化,第一个就是约分,我们把刚开始输入的两个数约分,值不会变,运算次数减少
然后是规定数的个数,最多到十(其实不用)
对于每一个长度,判断是否可行
下面给出代码:
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> using namespace std; inline int rd(){ int x=0,f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c=='-') f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } long long s[10000],ans[10000],step=1,flag=0; long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);} long long n,m; void dfs(long long a,long long b,long long cnt){ if(cnt>step) return ; if(a==1&&b>s[cnt-1]){ s[cnt]=b; if(!flag||s[cnt]<ans[cnt]) memcpy(ans,s,sizeof(s)); flag=1; return ; } long long l=b/a; if(l<=s[cnt-1]) l=s[cnt-1]+1; long long r=(step-cnt+1)*b/a; if(r>2147483647) r=2147483646; if(flag&&r>ans[step]) r=ans[cnt]-1; for(long long i=l;i<=r;i++){ s[cnt]=i; long long hh=gcd(i*a-b,i*b); dfs((i*a-b)/hh,(i*b)/hh,cnt+1); } return ; } int main(){ n=rd(); m=rd(); long long hh=gcd(n,m); n/=hh; m/=hh; if(n==1){ printf("%lld",m); return 0; } s[0]=1; while(step<=10){ dfs(n,m,1); if(flag){ printf("%lld",ans[1]); for(long long i=2;i<=step;i++) printf(" %lld",ans[i]); return 0; } step++; } printf("Impossible"); return 0; }
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿