分析

首先考虑 m=2m=2 是平凡的情况。

每次物品分成 m+1=3m+1=3 堆,最劣状态时一定有:每次目标物品出在最大的一堆,所以平均分,并上取整。

所以 nn 下降的方式即为

nm+1m+1m+1m+1\left\lceil\dfrac{\left\lceil\dfrac{\left\lceil\dfrac{\left\lceil\dfrac{n}{m+1}\right\rceil}{m+1}\right\rceil}{m+1}\right\rceil}{m+1}\right\rceil\cdots

据此不难得到最终的代码思路:每次除以 m+1m+1 上取整即可,并用计数器统计一下分了几次物品,如果某次小于 m+1m+1 份就代表一定可以一次找到目标物品。

代码

#include<cstdio>
int init(){
	char c = getchar();
	int x = 0, f = 1;
	for (; c < '0' || c > '9'; c = getchar())
		if (c == '-') f = -1;
	for (; c >= '0' && c <= '9'; c = getchar())
		x = (x << 1) + (x << 3) + (c ^ 48);
	return x * f;
}
void print(int x){
	if (x < 0) x = -x, putchar('-');
	if (x > 9) print(x / 10);
	putchar(x % 10 + '0');
}
int ceil(int n, int m){
	return (n + m - 1) / m;
}
int main(){
	int T = init();
	while (T--) {
		int n = init(), m = init() + 1, ans = 0;
		while (n > m)
			++ans, n = ceil(n, m);
		print(ans + 1), putchar('\n');
	}
}

整活

一种东西,有若干堆;
一堆东西,有若干样;
一样东西,有若干件;
一件东西,有若干个。

希望以后牛客比赛对题面含义清晰做出更高要求。