(File IO): input:search.in output:search.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
的奶牛喜欢探索农场周围的地形。一开始,所有
只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。假设路上到处都是新的岔口,计算最终被分成多少支队伍。
输入
第
行: 两个用空格隔开的整数:
,其中
表示分裂时两个队伍的奶牛数目差。
输出
行: 输出一个整数表示最终的队伍数。
样例输入
6 2
样例输出
3
数据范围限制
提示
输入说明:有
只奶牛,分裂时两个小组的奶牛差为
.
输出说明:最终有3支队伍分别为
6
/ \
2 4
/
1 3
数量分别为
。
解题思路
可以直接枚举每个分叉路口的两条队伍,递归大数和小数。
和差问题的公式:
两个数中较大的数:(大数)= (和+差) / 2
两个数中较小的数:(小数)= (和-差) / 2
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,k,ans;
void dfs(int s)
{
if(s>k&&(s-k)%2==0&&(s+k)%2==0)
{
ans++;
dfs((s-k)/2);
dfs((s+k)/2);
}
}
int main(){
freopen("search.in","r",stdin);
freopen("search.out","w",stdout);
scanf("%d%d",&n,&k);
dfs(n);
printf("%d",ans+1);
}