简单的试炼
来源:互联网 发布:手机定位考勤软件 编辑:程序博客网 时间:2024/04/27 14:41
【题目描述】
已知一个数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。
源代码:#include<cstdio>double 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的转换皆可通过。
*/
0 0
- 简单的试炼
- CODEVS 2669 简单的试炼
- .net平台的ajax试炼,校验用户名
- 【最强眼力山寨版】钛合金眼神的试炼
- 试炼基本功
- c++试炼
- 小考试炼
- 对洛谷“提高试炼场-其他数学问题”的爆破
- 对于洛谷提高试炼场-动态规划篇的爆破
- 试炼基本功(二)
- linux试炼01
- Swift 试炼(1)
- 试炼之--心
- mini2440裸机试炼之--myled
- AndroidPullToRefresh拉动效果初学试炼
- 洛谷试炼场---新手村
- 洛谷试炼场---USACO
- mini2440裸机试炼之——整合
- 中庸之道
- 总数统计
- 泥泞的道路
- 加工生产调度
- 区间质数
- 简单的试炼
- 小木棍
- 邮票面值设计
- 没有上司的舞会
- 邮票
- 幂次方
- 挖金币游戏
- 侦探推理
- 特种部队