#include <bits/stdc++.h>   using namespace std;   long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }   const int MAXK = 30000;   const int LGN = 16;   const int N = 1 << LGN;   const int MOD = 1000000007;   const double MYPI = acos(-1);   typedef struct Pol {     int x[MAXK + 1];   } Pol;   int bitrev[N];   complex<double> w[N];   void prefft() {     for (int i = (0); i < (N); ++i)       bitrev[i] = bitrev[i >> 1] >> 1 | ((i & 1) << (LGN - 1));     for (int i = (0); i < (N); ++i)       w[i] = complex<double>(cos(2 * MYPI * i / N), sin(2 * MYPI * i / N));   }   void fft(complex<double> a[N]) {     for (int i = (0); i < (N); ++i)       if (i < bitrev[i]) swap(a[i], a[bitrev[i]]);     for (int len = 2, step = N >> 1; len <= N; len <<= 1, step >>= 1) {       for (int i = 0; i < N; i += len) {         complex<double> *l = a + i, *r = l + (len >> 1), *p = w;         for (int off = (0); off < (len >> 1); ++off) {           complex<double> v = *r * *p;           *r = *l - v;           *l = *l + v;           ++l, ++r, p += step;         }       }     }   }   int inv[MAXK + 1];   int fact[MAXK + 1];   int ifact[MAXK + 1];   int ipow(int x, int n) {     int ret = 1;     while (true) {       if (n & 1) ret = (long long)ret * x % MOD;       if ((n >>= 1) == 0) return ret;       x = (long long)x * x % MOD;     }   }   int K;   void pmult(Pol &c, Pol &a, Pol &b) {     static complex<double> A[N], B[N], C[N], D[N];     for (int i = (0); i <= (K); ++i)       A[i] = complex<double>(a.x[i] & ((1 << 15) - 1), a.x[i] >> 15);     for (int i = (0); i <= (K); ++i)       B[i] = complex<double>(b.x[i] & ((1 << 15) - 1), b.x[i] >> 15);     for (int i = (K + 1); i < (N); ++i) A[i] = B[i] = complex<double>(0, 0);     fft(A);     fft(B);     for (int i = (0); i < (N); ++i) {       int j = (N - i) & (N - 1);       complex<double> w = (A[i] + conj(A[j])) * complex<double>(.5, 0);       complex<double> x = (A[i] - conj(A[j])) * complex<double>(0, -.5);       complex<double> y = (B[i] + conj(B[j])) * complex<double>(.5, 0);       complex<double> z = (B[i] - conj(B[j])) * complex<double>(0, -.5);       C[j] = w * y + w * z * complex<double>(0, 1);       D[j] = x * y + x * z * complex<double>(0, 1);     }     fft(C);     fft(D);     for (int i = (0); i <= (K); ++i) {       int w = (long long)(real(C[i]) / N + .5) % MOD;       int x = (long long)(imag(C[i]) / N + .5) % MOD;       int y = (long long)(real(D[i]) / N + .5) % MOD;       int z = (long long)(imag(D[i]) / N + .5) % MOD;       c.x[i] = (w + ((long long)(x + y) << 15) + ((long long)z << 30)) % MOD;     }   }   void pmult(Pol &a, int n2, Pol &b) {     static Pol c;     int step = ipow(2, n2), mlt = 1;     for (int i = (0); i <= (K); ++i)       c.x[i] = (long long)a.x[i] * mlt % MOD, mlt = (long long)mlt * step % MOD;     pmult(a, c, b);   }   void ppow(Pol &a, Pol &b, int n) {     for (int i = (0); i <= (K); ++i) a.x[i] = i == 0 ? 1 : 0;     static Pol c;     for (int i = (0); i <= (K); ++i) c.x[i] = b.x[i];     int cn = 1;     while (true) {       if (n & 1) pmult(a, cn, c);       if ((n >>= 1) == 0) break;       pmult(c, cn, c), cn += cn;     }   }   long long n;   Pol h1;   Pol hn;   void run() {     fact[0] = 1;     for (int i = (1); i <= (MAXK); ++i)       fact[i] = (long long)fact[i - 1] * i % MOD;     inv[1] = 1;     for (int i = (2); i <= (MAXK); ++i)       inv[i] = (MOD - (long long)(MOD / i) * inv[MOD % i] % MOD) % MOD;     ifact[0] = 1;     for (int i = (1); i <= (MAXK); ++i)       ifact[i] = (long long)ifact[i - 1] * inv[i] % MOD;     scanf( %I64d%d , &n, &K);     if (n > K) {       printf( 0 n );       return;     }     h1.x[0] = 0;     for (int i = (1); i <= (K); ++i) h1.x[i] = ifact[i];     prefft();     ppow(hn, h1, n);     int ret = 0;     for (int i = (0); i <= (K); ++i) {       int cur = (long long)hn.x[i] * fact[K] % MOD * ifact[K - i] % MOD;       if ((ret += cur) >= MOD) ret -= MOD;     }     printf( %d n , ret);   }   int main() {     run();     return 0;   }