我正在尝试解决有关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;
}
请帮帮我。
答案 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)
的可能性..如果它在那里请指出..