前言
“前20年我们吃饭,睡觉,玩乐,享受生活;接下来的40年为养家糊口疲于奔命;而最后的10年呢,每天蹲在门口,和过往的行人打着招呼…”欢迎来到嘟嘟课堂。今天,嘟嘟老师讲一道和差问题复杂化再加上递归的题——探索的奶牛。
题目描述
FJ的奶牛喜欢探索农场周围的地形。一开始,所有N(1<=N<=1,000,000,000)只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。。。
-假设路上到处都是新的岔口,计算最终被分成多少支队伍。
输入
第1行: 两个用空格隔开的整数:N,K
输出
第1行: 输出一个整数表示最终的队伍数。
样例输入
6 2
样例输出
3
样例说明
输入说明:有6只奶牛,分裂时两个小组的人数差为2.
输出说明: 最终有3支队伍分别为(数量分别为2,1,3)
6
/ \
2 4
/ \
1 3
思路
其实这就是一道和差问题。比赛时多加了个这个:
if (k=1) and (n mod 2=0) then
begin
writeln(0);
halt;
end;
就错了。
原因:不过怎样,至少会有一条队伍,就是初始的那条队伍。
我们枚举每个分叉路口的两条队伍,递归大数和小数。
和差问题应该是二年级的奥数内容,要是还没有接触过的,就简单说一下吧:
给出两个数的和与差,求这两个数
附上和差问题的公式:
两个数中较大的数(大数)=(和+差) div 2
两个数中较小的数(小数)=(和-差 ) div 2
详见代码
代码
Download
var
n,k,ans:longint;
procedure sb(x:longint);
begin
if ((x-k) mod 2=0) and ((x-k)>0) then
begin
inc(ans);
sb((x-k) div 2);
sb((x+k) div 2);
end;
end;
begin
ans:=1;
readln(n,k);
sb(n);
writeln(ans);
end.