题意
1+k+k^2+...+k^r=n
或者
k+k^2+...+k^r=n;
给定n
求满足上面其中一个的r和k
输出r*k最小
1+k+k^2+...+k^r=n
或者
k+k^2+...+k^r=n;
给定n
求满足上面其中一个的r和k
输出r*k最小
有相同的r*k值 输出r较小的
使用二分查找
#include<cstdio>
#include<cmath>
typedef long long ll;
ll k,r;
ll myp(ll p,ll pn)
{
ll ret=1;
while(pn>0)
{
pn--;
ret*=p;
}
return ret;
}
ll sum(ll tk,ll tr)
{
if(tk==1)
{
return tk;
}
return ( (myp(tk,tr+1)-1) /(tk-1) );
}
void fun(ll tr,ll n) //二分查找
{
ll min=1;
ll max=(ll)pow((double)n,(double)1/(double)tr) + 1;
ll mid;
while(min<max)
{
mid=(min+max)/2;
if(sum(mid,tr)<n)
{
min=mid+1;
}
else
{
max=mid;
}
}
if(sum(min,tr) == n)
{
if(tr*min<r*k)
{
r=tr;
k=min;
}
else if(tr*min == r*k && tr < r)
{
r=tr;
k=min;
}
}
}
void cal(ll n)
{
ll i;
ll t=(ll)( log( (double) ( n+1 ) ) / log( (double) 2) );
for(i=2;i<=t;i++)
{
fun(i,n);
}
}
int main()
{
ll n;
while(~scanf("%lld",&n))
{
r=1;
k=n-1;
cal(n);
cal(n+1);
printf("%lld %lld\n",r,k);
}
}