设initial cat 高为h,帽子里有n只下一层的猫,一共k+1 层,则:(n+1)^k= h,n^k= worker
对k 从1开始枚举,判断是否满足以下3个条件
(1)令a= worker^(1/ k), a为整数
(2)令b= h^(1/ k),b为整数
(3)b-a=1
对n进行枚举,然后判断log(worker)/ log(n)和log(h)/ log(n+1)是否为整数且相等是同样道理。
nonworker cats的数量和所有猫的高度总和本质上都是等比数列的求和,我一开始想直接用一个算式输出结果,但是一直WA,最后老老实实做加法吧,总算AC了。
这道题需要注意的一个地方是,有可能输入h=1,worker=1,意即只有一只猫,共1层,此时k=0。由于k是从1开始枚举的,所以循环不会停止。提交结果是TLE的,看看是否没有考虑到这一点。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long int h,worker,k,n,tot,nonworker,p;
double a,b;
while(cin>>h>>worker)
{
if(!h)
break;
if(h==1&&worker==1)
{
cout<<"0 1"<<endl;
continue;
}
for(k=1;;k++)
{
a=pow(h,1.0/k),b=pow(worker,1.0/k);
if(fabs(floor(a+0.5)-a)<1e-6&&fabs(floor(b+0.5)-b)<1e-6&&floor(a+0.5)-floor(b+0.5)==1)
{
n=floor(b+0.5);
break;
}
}
tot=h,nonworker=0,p=1;
while(h!=1)
{
nonworker+=p;
p*=n;
h/=n+1;
tot+=h*p;
}
cout<<nonworker<<' '<<tot<<endl;
}
return 0;
}