http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1545
/*
dp[i][j] 表示**不受限制的前提下。
長度爲i ,當前異或值爲j 的個數,Xor 表示當前的異或值
flag 表示當前位 是否受限制
*/
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<cstdlib>
using namespace std;
typedef long long LL;
long long n,k;
LL num[20],dp[25][20];
LL dfs(int len,int Xor,int flag)
{
if(len == 0)
{
if(Xor == 0) return 1;
return 0;
}
int ed = flag? num[len-1]:9;
if(!flag && dp[len][Xor] != -1) return dp[len][Xor];//如果不收限制,且dp值已知,直接返回
LL ans = 0;
for(int i = 0; i <= ed; i++)
{
ans += dfs(len-1,Xor^i,i==ed && flag);
}
if(!flag) dp[len][Xor] = ans;//當次狀態不收限制,可以對dp 賦值。
return ans;
}
int trans()
{
int len = 0;
while(n)
{
num[len++] = n%10;
n /= 10;
}
return len;
}
int main()
{
memset(dp,-1,sizeof(dp));
while(cin>>n>>k)
{
if(k > 15) {cout<<0<<endl; continue;}
int len = trans();
int f = 0;
if(k == 0) f = 1;
long long ans = dfs(len,(int)k,1);
cout<<ans - f<<endl;
}
return 0;
}