#include <iostream>
#include <map>
using namespace std;
typedef long long ll;
map<ll,ll> m;
ll f(ll n)
{
if(n<3) return 0;
if(n==3) return 1;
if(m.find(n)!=m.end()) return m[n];
return m[n]=f(n/2)+f((n+1)/2);
}
int main()
{
ll n;
while(cin>>n,n!=0)
cout<<f(n)<<endl;
return 0;
}
計(jì)算情況數(shù)。
每一次都篩掉隨機(jī)一半,所以把一次選擇變成被拆分后的兩次選擇相加,可以想到,如果人數(shù)是偶數(shù),(n+1)/2并不影響結(jié)果,而如果人數(shù)是奇數(shù),那一定會(huì)被拆成兩個(gè)連續(xù)的數(shù)字相加,此時(shí)(n+1)/2可以表示較大的那個(gè)數(shù)