zoj 3665 Yukari's Birthday【二分】
题意:给出一个数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;
}

浙公网安备 33010602011771号