【题目描述】
已知一个数S,求X和Y,使得2^X+3^Y=S。
【输入描述】
输入多组数据,每行一个整数S,当S=0时输入结束。
【输出描述】
X和Y,以2^X+3^Y=S的形式输出。若有多组解,输出X最小的那组。
【样例输入】
13
33
0
【样例输出】
2^2+3^2=13
2^5+3^0=33
【数据范围及提示】
对于30%的数据:S≤50,000,000,数据组数≤5000;
对于50%的数据:S≤3,000,000,000,数据组数≤20000;
对于80%的数据:S≤3,000,000,000,000,数据组数≤50000;
对于100%的数据:S≤200,000,000,000,000,数据组数≤80000。
源代码:#includedouble n;long long s;int num;bool Exam(long long t,int &num) //递归判断2^N。{ if (t%2) return false; if (t==2) return true; num++; bool k; k=Exam(t/2,num); return k;}void Solve(){ int ans1(0),ans2(0); for (int a=30;a>=0;a--) //枚举,3^30>200000000000000。 { int k=a; long long number=1,x=3; while (k) //快速幂。 { if (k&1) number*=x; x*=x; k=k>>1; } num=1; if (s-number>0&&(s-number==1||Exam(s-number,num))) { ans1=a; ans2=num; break; //找到答案立即停止循环。 } } n=s; //如此之恶心,实为罕见。 printf("2^%d+3^%d=%.0lf\n",ans2,ans1,n); //尼玛真恶心。}int main() //类型转换好恶心啊!{ scanf("%lf",&n); s=n; printf("%lld",s); while (s) { Solve(); scanf("%lf",&n); s=n; } return 0;} /* Windows系统下应使用"%I64d"输出Long Long类型,Linux等考试评测环境应使用"%lld",本题中进行Long Long与double的转换皆可通过。 */