题目链接:https://www.luogu.com.cn/problem/P2907
这题我的思路是递归。
大致题意:
初始有m群头牛。
如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差 K 头,那么就会分成两群牛。
否则,牛群不会分裂,原地不动。
问最后分成了多少群牛。(求牛被划成了多少个小群体)
假设能分成两个群体,设较多的小群体牛数为a,较少的小群体牛数为b
可得方程组:
a + b = m
a - b = k
由上方程组可得
b = ( m - k )/ 2
因此能分裂的条件是,分裂前的牛数减去相差的k值能被2整除
若不能分裂,即就是一群
由此递归函数代码如下
int find(int m, int k)
{
int sum = 0, a, b;
if (0 == (m - k) % 2 && m > k)
{
b = (m - k) / 2;
a = b + k;
sum += find(a, k);
sum += find(b, k);
}
else
{
sum = 1;
}
return sum;
}
全部代码如下
#include <iostream>
using namespace std;
int find(int m, int k);
int main()
{
long long m, k, x = 1, sum;
scanf("%lld %lld", &m, &k);
sum = find(m, k);
printf("%d\n", sum);
return 0;
}
int find(int m, int k)
{
int sum = 0, a, b;
if (0 == (m - k) % 2 && m > k)
{
b = (m - k) / 2;
a = b + k;
sum += find(a, k);
sum += find(b, k);
}
else
{
sum = 1;
}
return sum;
}