http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4888
枚举圈数r,二分k
本来一直TLE,改成成%lld就过了,真奇葩
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <ctime>
long long n;
long long minl,minr;
int two(int left,int right,int num)
{
long long sum;
while(left<right)
{
int mid=(left+right)/2;
sum=0;
long long knum=1;
int flag=0;
for(int i=1;i<=num;i++)
{
knum*=mid;
sum+=knum;
if(sum>1000000000000LL||sum<0)
{
flag=1;
break;
}
}
//printf("~%I64d %d %d\n",sum,mid,num);
if(flag)
{
right=mid;
continue;
}
if(sum>n)
right=mid;
else
left=mid+1;
if(sum+1==n||sum==n)
{
// printf("~%d\n",mid);
if(mid*num<minr*minl)
minl=num,minr=mid;
break;
}
}
return 0;
}
int main()
{
// printf("%I64d\n",quickpow(2,31));
while(scanf("%lld",&n)!=EOF)
{
minl=1;
minr=n-1;
//int begins=clock();
int sqr=sqrt(n);
for(int i=2;i<=40;i++)
two(1,1000000,i);
//int ends=clock();
//printf("%d\n",ends-begins);
printf("%lld %lld\n",minl,minr);
}
}