解法一:
设left为多,right为少
每次分裂满足;
所以;
定义函数num(n,k),子问题为num(l,k)和num(r,k)。
递归结束:不可以精确分裂
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define endl '\n'
#define int long long
int sum = 0;
void num(int n, int k) {
if (n <= 0) return;
if ((n - k) == 0) {
sum++;
return;
}
if ((n + k) & 1 || (n - k) & 1) {
sum++;
return;
}
num((n + k) / 2, k);
num((n - k) / 2, k);
return;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, k;
cin >> n >> k;
num(n, k);
cout << sum;
return 0;
}
解法二:
摘自子谦
#include<iostream>
using namespace std;
int f(long long a,long long b)
{
if ((a+b)%2==0&&a>b)
{
return f((a+b)/2,b)+f((a-b)/2,b);
}
else return 1;
}
int main()
{
long long n,k;
cin>>n>>k;
cout<<f(n,k);
}