//找出从1到L的二进制回文数个数 //a2n = an a4n+1 = 2*a2n-an a4n+3 = 3*a2n+1 - 2*an //难点在于看出公式是回文式 //模拟下OK #include <iostream> using namespace std; int s[34]; int f( int L ) { int result = 0; while( L ) { result++; L /= 2; } return result; } int main() { s[0] = 1; for( int i = 1;i < 32;i++ ) s[i] = s[i-1] * 2; int L; while( cin>>L ) { int k = f(L); if( k == 1 ) { cout<<1<<endl; continue; } int result = 0; for( int i = 1;i < k;i++ ) result += s[(i+1)/2-1]; int A = s[k-1] + s[0]; if( k % 2 ) { k = (k-2)/2; for( int i = 0;i <= s[k+1]-1;i++ ) { int _i = i; int re = i; int j = 2*k; for(int jj = 0;jj < k;jj++ ) { re +=( ( _i % 2 ) * s[j--] ); _i /= 2; } if( re * 2 + A <= L ) result++; } } else { k = (k-2)/2; for( int i = 0;i <= s[k]-1;i++ ) { int _i = i; int re = i; int j = 2*k-1; for(int jj = 0;jj < k;jj++ ) { re +=( ( _i % 2 ) * s[j--] ); _i /= 2; } if( re * 2 + A <= L ) result++; } } cout<<result<<endl; } return 0; }