//To debug :  g++ -g file.cpp -o code
//to flush output : fflush(stdout) or cout.flush()
//cout<<setprecision(p)<<fixed<<var
//use 1LL<<i to for 64 bit shifting , (ll)2 because by default 2 is ll
//take care of precedence rule of operators 
//do not forget to change the sizes of arrays and value of contants and other things after debugging  
 
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,n) for(i=a;i<n;++i)
#define irep(i,n,a) for(i=n;i>a;--i)
#define mod 1000000007
#define pb push_back
#define big 9223372036854775807
#define big1 LONG_MAX
#define big2 ll_MAX
#define big3 1000000000
#define sma1 LONG_MIN
#define sma2 ll_MIN
#define sma3 -1000000000
#define mp make_pair
#define dub double
#define ivec vector<ll>
#define lvec vector<long long>
#define cvec vector<char>
#define svec vector<string>
#define mt make_tuple
#define MOD 998244353
#define ld long double
#define pi acos(-1.0)
 
#define SZ(x)  (ll)(x.size())
 
//comment the below if not required
 
/*
#define ss second.second
#define ff first.first
#define f first
#define s second
#define sf second.first
#define fs first.second
*/
 
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
 
//cout<<"Case #"<<c<<": "<<ans<<"\n" ;

const ll M = 5e3+1 , B=14;

ll dp[B][M],n,m,i,j,sum,k,temp,tot,f[M],num,den,mi[M];

ll fac(ll n,ll k)
{
	num=f[n];
	den=(mi[n-k]*mi[k])%MOD;
	num=(num*den)%MOD;
	return num;
}

ll modinv(ll num,ll md)
{
	ll p = md-2;
	ll ans = 1;

	for(;p;num=(num*num)%md,p/=2)
	{
		if(p&1)
			ans = (ans*num)%md;
	}

	return ans;

}

int main()
{
	IOS;

	cin>>n>>m;

	dp[0][0]=1;

	f[0]=1;

	for(i=1;i<M;++i)
		f[i]=(f[i-1]*i)%MOD;

	for(i=0;i<M;++i)
		mi[i]=modinv(f[i],MOD);

	for(i=0;i<=m;++i)
	{
		for(j=0;j<=12;++j)
		{
			sum=dp[j][i];

			for(k=0;k<=n;k+=2)
			{
				if((i+k*(1<<j))<=m)
					temp=(sum*fac(n,k))%MOD;
				else
					break;
				

				dp[j+1][i+k*(1<<j)]=(dp[j+1][i+k*(1<<j)]+temp)%MOD;
			}

		}
	}

	cout<<dp[13][m]<<"\n";

	return 0;
}
// DeNsE - EcLiPsE //
// WHAT is DEAD may NEVER die //

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <map>
#include <unordered_map>
#include <cmath>
#include <iomanip>
#include <set>
#include <cstring>
#include <stack>
#include <sstream>
#include <queue>
#include <unordered_set>
#include <cstdlib>

using namespace std;

#define nitro ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define double long double
//#define endl " \n"

const int inf = (1ll << 62) - 1;
const int mod = 1e9 + 7;
const int N = 21;
const double pi = 3.14159265358979323846;

int bPow(int a, int b){
    int res = 1;
    while(b) {
        if (b & 1) {
            res = (res * a) % mod;
        }
        b >>= 1;
        a = (a * a) % mod;
    }
    return res % mod;
}

int gcd(int a, int b)
{
    if(a < b)
        swap(a, b);
    if (b == 0)
        return a;
    return gcd(b, a % b);

}

vector<int> fact(N, 0ll);
void factorial(){
    fact[0] = 1, fact[1] = 1;
    for(int i = 2; i < N; i++){
        fact[i] = (fact[i - 1] * i) % mod;
    }
}

int ncr(int n, int r){
    if(r > n)
        return 0;
    int ans = fact[n] % mod;
    ans *= bPow(fact[r], mod - 2) % mod;
    ans %= mod;
    ans *= bPow(fact[n - r], mod - 2) % mod;
    ans %= mod;
    return ans;
}

vector<int> primes(N, -1);
void sieve(){
    iota(primes.begin(), primes.end(), 0);
    for (int i = 2; i * i <= N; ++i) {
        if(primes[i] == i){
            for (int j = 2 * i; j < N; j += i) {
                primes[j] = i;
            }
        }
    }
}

bool isEven(char c){
    int num = c - '0';
    if(num & 1)
        return false;
    return true;
}

string divide(string s){
    string ans;
    int cur = 0;
    for (char i : s) {
        cur = 10 * cur;
        cur += (i - '0');
        if(cur < 2) {
            if(!ans.empty())
                ans += '0';
            continue;
        }
        if(cur & 1){
            cur /= 2;
            string ss = to_string(cur);
            ans += ss;
            cur = 1;
        }else{
            cur /= 2;
            string ss = to_string(cur);
            ans += ss;
            cur = 0;
        }
    }
    return ans;
}


void solve() {
    string s;
    int k;
    cin >> s >> k;
    while (k--){
        int n = s.size();
        if(n < 3){
            s += "200";
            continue;
        }
        n--;
        if(s.back() != '0'){
            s += "200";
            continue;
        }
        n--;
        if(s[n] != '0'){
            s += "200";
            continue;
        }
        n--;
        if(!isEven(s[n])){
            s += "200";
            continue;
        }
        s.pop_back();
        s.pop_back();
        s = divide(s);
    }
    cout << s << endl;
}


signed main(){
    nitro
    int tc = 1, test = 1;
    //cin >> tc;
    while(tc--){
        //cout << "Case #" << test++ << ": ";
        solve();
    }
}