(纪中)2402. 探索的奶牛(search)【和差】

(File IO): input:search.in output:search.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet


题目描述
F J FJ 的奶牛喜欢探索农场周围的地形。一开始,所有 N ( 1 < = N < = 1 , 000 , 000 , 000 ) N(1<=N<=1,000,000,000) 只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。假设路上到处都是新的岔口,计算最终被分成多少支队伍。


输入
1 1 行: 两个用空格隔开的整数: N K N,K ,其中 K K 表示分裂时两个队伍的奶牛数目差。

输出
1 1 行: 输出一个整数表示最终的队伍数。


样例输入
6 2

样例输出
3


数据范围限制


提示
输入说明:有 6 6 只奶牛,分裂时两个小组的奶牛差为 2 2 .
输出说明:最终有3支队伍分别为


 6
/ \

2 4
/
1 3
数量分别为 2 , 1 , 3 2,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);
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4917

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104860074