One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got access to the memory of his not less mean sister Hexadecimal. He loaded there a huge amount of n different natural numbers from 1 to n to obtain total control over her energy.
But his plan failed. The reason for this was very simple: Hexadecimal didn't perceive any information, apart from numbers written in binary format. This means that if a number in a decimal representation contained characters apart from 0 and 1, it was not stored in the memory. Now Megabyte wants to know, how many numbers were loaded successfully.
Input data contains the only number n (1 ≤ n ≤ 109).
Output the only number — answer to the problem.
10
2
For n = 10 the answer includes numbers 1 and 10.
题解:数位dp一发a。
//Wud
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <sstream>
#include <fstream>
#include <set>
#include <map>
#include <string.h>
#define EPS 1e-9
#define M_PI 3.14159265358979323846
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int maxn = 5e6+7;
int n;
int s[15];
int dfs(int lim,int th)
{
int ans = 0;
if(th<1) return 1;
int b = lim?s[th-1]:1;
for (int i = 0;i <= b;i++)
{
if(i==0)
ans+=dfs(lim&&(i==b),th-1);
else if(i==1)
ans+=dfs(lim&&(i==b),th-1);
}
return ans;
}
int main(void)
{
while (scanf("%d",&n)!=EOF)
{
int k = 0,u = n;
while (u)
{
s[k++] = u%10;
u/=10;
}
int ans = dfs(1,k);
cout<<ans-1<<endl;
}
return 0;
}