为什么spoj给出了“整数幂”解决方案的错误答案?

时间:2014-07-15 15:42:09

标签: c algorithm

我正在尝试解决有关spoj的INTEGER1问题。我的方法很简单。它首先计算从2到63的所有幂的x(x ^ i = n)。然后它删除所有重复,然后最终加总功率。但是它给了我关于spoj的错误答案。 我已经在Ideone和我的机器上尝试了很多用例,但它给了我正确的结果。

#include<stdio.h>
#include<math.h>
int main()
{
    unsigned long long int a,b,result;
    unsigned long long int power[65],temp;
    int i,j;

    while(1)
    {
        scanf("%lld",&a);
        scanf("%lld",&b);
        if(a==0)
            break;
        result=0;
        power[0]=0;
        power[1]=b-a+1;

        a--;
        for(i=2;i<64;i++)
        {
            power[i]=floor(pow((long double)b,(long double)1/i));
            while(pow((power[i]-1),(long double)i)>=b)
            {
                power[i]--;
            }
            while(pow((power[i]+1),(long double)i)<=b)
            {
                power[i]++;
            }

            temp=floor(pow((long double)a,(long double)1/i));
            while(pow((temp-1),(long double)i)>=a)
            {
                temp--;
            }
            while(pow((temp+1),(long double)i)<=a)
            {
                temp++;
            }
            power[i]-=temp;
        }
        for(i=63;i>=1;i--)
        {
            for(j=i*2;j<64;j=j+i)
            {
                power[i]-=power[j];
            }
        }
        for(i=1;i<64;i++)
        {
            result+=i*power[i];
        }
        printf("%lld\n",result);
    }

    return 0;
}

请帮帮我。

1 个答案:

答案 0 :(得分:1)

输入

100 100
10000 100000000
100000000000 100000000000
100000000000000 100000000000000
1000000000000000 1000000000000000
0 0

您的输出是

2
100001508
11
14
11

但正确的输出是

2
100001508
11
14
15

现在找到kth的{​​{1}}根...做一些数学

a

采用自然对数 (ln)双方

let x = a ^ (1 / k) (^ denotes power NOT XOR)(this is also `kth` root of `a`)

现在双方ln x = ln (a ^ (1 / k)) = (1 / k) * ln (a) {property of log}

exponent

并根据exp (ln x) = exp (ln (a) / k) 属性

log

所以我们终于得到了

exp (ln x) = x

这是一个在x = exp (ln(a) / k) which is equivalent to `kth` root of `a`

中找到它的函数

请记住,在数学中我们使用C来查找自然对数,它等同于ln

中的log
C

编辑1 : - 正如OP所指出的那样,会有溢出,但我不这么认为会发生..考虑一下我们的案例

double kth_root_finder(long long int a, long long int k) {
    if (k == 1) {
         return a;
    }
    if (k == 2) {
         return sqrt(a);
    }
    return exp(log(a) / k);
}

然后

a = 1000000000000000000 and k = 2 (worst case)(ignoring second if condition)

here是上面的链接.. 所以我不认为有exp(log(1000000000000000000) / 2) = 999999999.999999 = 1000000000(if ceil is taken) 的可能性..如果它在那里请指出..