农场周围的道路
描述
约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地.她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的).这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走.如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走. 奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤1000),那么在三岔路口牛群就会分裂.否则,牛群不会分裂,她们都将在这里待下去,平静地吃草. 请计算,最终将会有多少群奶牛在平静地吃草.-
输入
一行2个用一个空格隔开的整数N和K,1<=N<=10^9。
输出
一行一个整数,表示最后停下来吃草的奶牛的组数。
输入样例 1
6 2
输出样例 1
3
#include<bits/stdc++.h>
using namespace std;
int ans=0;
int cow(int n,int k){
if(n<=k||(n-k)%2==1){
++ans;
return ans;
}
cow((n-k)/2,k);
cow((n+k)/2,k);
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
cout<<cow(n,k);
return 0;
}
个人理解
本题目主要需要了解分组的规律。
假设有 n 头奶牛,遇到岔路口后分为 x 头和 x+k 头。
则 x+x+k=n 解得 x=(n-k)/2 ,x+k=(n+k)/2;
即每次遇上岔路口就会分成 (n-k)/2 头和 (n+k)/2 头奶牛。
而函数中 if(n<=k||(n-k)%2==1) 是为了避免出现半只牛的情况。奶牛不可能有半只对吧?!!