简单的试炼

来源:互联网 发布:手机定位考勤软件 编辑:程序博客网 时间: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
原创粉丝点击