HDU 4282 A very hard mathematic problem

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

#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;

}

你可能感兴趣的:(Math)