IT民工
加油!

枚举 + 二分,代码写得挫!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

typedef __int64 LL;
LL x, y, z, D, S;
LL k;

int main()
{
    int i, j;
    while(scanf("%I64d", &k), k)
    {
        S = 0;
        for(D = 1; D < k / 2; D <<= 1, S ++);
        bool flag1, flag2;
        LL a, b, c;
        int ans = 0;
        for(z = 2; z <= S; z ++)
        {
            flag1 = true;
            for(x = 1; ; x ++)
            {
                flag2 = true;
                a = x;
                for(i = 1; i < z; i ++)
                {
                    a *= x;
                    if(a > k)
                    {
                        flag1 = false;
                        break;
                    }
                }
                //printf("%I64d\n", a);
                if(!flag1) break;
                LL l = x + 1, r = k - a;

                while(l <= r)
                {
                    y = l + r >> 1;
                    //printf("%I64d %I64d %I64d\n", x, y, z);
                    b = y;
                    for(i = 1; i < z; i ++)
                    {
                        b *= y;
                        if(b >= k - a)
                        {
                            r = y - 1;
                            flag2 = false;
                            break;
                        }
                    }
                    //printf("%I64d\n", b);
                    if(a + b + (x * y * z) > k)
                        r = y - 1;
                    else if(a + b + (x * y * z) == k)
                    {
                        ans ++;
                        break;
                    }
                    else l = y + 1;
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
posted on 2012-09-15 11:06  找回失去的  阅读(236)  评论(0)    收藏  举报