发份AC代码 仅供参考 运行时间390MS 不是最高的 看到有大神20ms 只能膜拜T_T
其实实质是等比数列的和固定 然后求公比k和项数r的所有情况啦
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main(void)
{
long long int n,r,k,min,sqrtn;
while(scanf("%lld",&n)!=EOF)
{
r=1;
k=min=n-1;
for(long long int r1=2; r1<=log2(n);r1++)//要超过1*n-1的话 由等比数列求和公式 k=2 r最多也就log2(n)
{
for(long long int k1=powl(10,(log10(n+1)/r1));; k1++)//等比数列的公式 可以约有k^r-1=n所以可以根据这个找k,就省了很多循环次数咯
{
long long int temp=(powl(k1,r1)-1)/(k1-1)*k1;
temp++;
if(temp==n||temp-1==n)//刚开始没看清题目,题目说的中间最多放1个蜡烛 (也就是可以不放T_T 靠搞得我WA好多次 才发现)
{
if(k1*r1<min)
{
min=k1*r1;
k=k1;
r=r1;
}
break;
}
else if(k1/(k1-1.0)*(powl(k1,r1)-1)+1>n){//求和结果超出n了显然不满足,跳出
break;
}
}
}
printf("%lld %lld\n",r,k);
}
return 0;
}