题目描述
Farmer John‘s cows have taken an interest in exploring the territory around the farm. Initially, all N (1 <= N <= 1,000,000,000) cows commence traveling down a road in one big group. Upon encountering a fork in the road, the group sometimes chooses to break into two smaller (nonempty) groups with each group continuing down one of the roads. When one of those groups arrives at another fork, it might split again, and so on.
The cows have crafted a peculiar way of splitting: if they can split into two groups such that the sizes of the groups differ by exactly K (1 <= K <= 1000), then they will split in that way; otherwise, they stop exploring and just start grazing peacefully.
Assuming that there will always be new forks in the road, compute the final number of groups of peacefully grazing cows.
约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地.她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的).这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走.如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走. 奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤1000),那么在三岔路口牛群就会分裂.否则,牛群不会分裂,她们都将在这里待下去,平静地吃草. 请计算,最终将会有多少群奶牛在平静地吃草.
输入输出格式
输入格式:
- Line 1: Two space-separated integers: N and K
输出格式:
- Line 1: A single integer representing the number of groups of grazing cows
输入输出样例
输入样例#1:
6 2
输出样例#1:
3
说明
There are 6 cows and the difference in group sizes is 2.
There are 3 final groups (with 2, 1, and 3 cows in them).
6 / \ 2 4 / \ 1 3
题解
看到这道题第一眼反应就是搜索了吧。第一次写的搜索竟然没过,由于判断条件太多导致超时了QAQ。后来加了优化,代码如下:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 5 using namespace std; 6 int ans,n,k; 7 void dfs(int x) { 8 if(x<k+2 || (x+k)&1) { 9 //x<k+2表示现在数量不足以分成两组,(x+k)&1表示数量单数不可能分成两组(可不能把牛牛分成两半ovo) 10 ans++; 11 return; 12 } 13 else { 14 dfs((x-k)>>1); 15 dfs(((x-k)>>1)+k); 16 } 17 } 18 int main() { 19 scanf("%d%d",&n,&k); 20 dfs(n); 21 printf("%d",ans); 22 return 0; 23 }