#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const __int64 maxn=1<<16;
__int64 k;
__int64 a[maxn][32];
const __int64 MAX=2147483648;//1<<31必须这样写……
void init()//我通过打印乘方表发现错误的
{
memset(a,0,sizeof(a));
for(int i=1;i<maxn;i++)
a[i][1]=i;
for(int i=1;i<maxn;i++)
for(int j=2;j<32;j++)
{
a[i][j]=a[i][j-1]*i;
if(a[i][j]>=MAX)
{
a[i][j]=0;
break;
}
}
}
bool f(__int64 sum,__int64 e,__int64 x)
{
__int64 l,h,mid;
l=x+1;
h=maxn;
while(l<=h)
{
mid=(h+l)/2;
if(a[mid][e]==0)
{
h=mid-1;
continue;
}
__int64 tmp=a[mid][e]+e*mid*x;
if(tmp==sum)
return true;
else if(tmp>sum)
h=mid-1;
else
l=mid+1;
}
return false;
}
int main()
{
init();//设置乘方表,大于等于2的31次方的都为0
while(~scanf("%I64d",&k) && k)//大数字输入输出格式要注意
{
__int64 ans=0;
__int64 sum=0;
__int64 e;
for(__int64 x=1;x<maxn;x++)
for(e=2;e<32;e++)
{
if(a[x][e]==0) break;
sum=k-a[x][e];
if(sum<=0) break;
if(f(sum,e,x))
ans++;
}
printf("%I64d\n",ans);
}
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交