您的位置:首页 > 其它

zoj 3665 Yukari's Birthday【二分】

2012-10-16 00:07 357 查看
题意:给出一个数n,18<=n<=10^12,代表有n个蜡烛,要把这n个蜡烛插到蛋糕上,0层最多可以插一个,一共r层,第一层k个,第二层k^2个,……,第r层k^r个,

输出r和k,情况多种输出r*k最小的,r*k最小的有多种输出r最小的。

代码:

#include<stdio.h>
#include<math.h>

struct node {
long long r;
long long k;
long long tot;
};

int main()
{
long long n;
while(scanf("%lld", &n) != EOF) {
struct node data;

data.r = 1;
data.k = n-1;
data.tot = n-1;
for(int r = 2; r <= 40; r++) {
long long high = (long long)pow(n, 1.0/r);
long long low = 2, mid;
bool bl = 0;

while(low <= high) {
mid = (low+high)/2;
long long ans;

ans = mid*(1-(long long)pow(mid, r))/(1-mid);
if(ans == n || ans == n-1) {
bl = 1;
break;
} else if(ans > n) {
high = mid - 1;
} else {
low = mid + 1;
}
}

if(data.tot == mid * r && bl) {
data.r = data.r < r ? data.r : r;
data.k = data.r < r ? data.k : mid;
continue;
}
if(bl) {
data.tot = data.tot < mid * r ? data.tot : mid * r;
data.r = data.tot < mid * r ? data.r : r;
data.k = data.tot < mid * r ? data.k : mid;
}
}
printf("%lld %lld\n", data.r, data.k);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: