#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int MOD = 1000000007;
 
int addmod(int a, int b){ a+=b; if(a>=MOD) a-=MOD; return a; }
int64 mulmod(int64 a, int64 b){ return (a*b)%MOD; }
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    long long n, k, x;
    if(!(cin >> n >> k >> x)) return 0;
    long long T = k*(k+1)/2;
    long long S = n - x * T;
    if(S < 0){
        cout << 0 << "\n";
        return 0;
    }
    int Tmax = (int)T;
 
    // cnt[s] = số tập con của {1..k} có tổng s
    vector<int> cnt(Tmax+1, 0);
    cnt[0] = 1;
    for(int i=1;i<=k;i++){
        for(int s=Tmax; s>=i; --s){
            cnt[s] = addmod(cnt[s], cnt[s - i]);
        }
    }
 
    // Precompute list of values v with cnt[v] != 0 to skip zeros
    vector<int> vals;
    vals.reserve(Tmax+1);
    for(int v=0; v<=Tmax; ++v) if(cnt[v]) vals.push_back(v);
 
    // Determine maximum pos to process:
    int maxSbit = 0;
    if(S > 0) maxSbit = 63 - __builtin_clzll(S); // highest bit index of S
    int LOGT = 0;
    while((1LL<<LOGT) <= Tmax) ++LOGT;
    int MAXPOS = maxSbit + LOGT + 3; // safe margin
 
    // dp[tight][carry] : tight=0/1
    // carry ranges 0..Tmax
    vector<int> dp_tight0(Tmax+1, 0), dp_tight1(Tmax+1, 0);
    dp_tight1[0] = 1;
 
    for(int pos=0; pos<=MAXPOS; ++pos){
        vector<int> ndp0(Tmax+1, 0), ndp1(Tmax+1, 0);
        int Sbit = ( (S>>pos) & 1 );
        bool xbit = ((x>>pos) & 1);
        // list of possible v for this pos
        if(xbit){
            // must choose v = 0
            int v = 0;
            int ways = cnt[v];
            // handle tight=0
            for(int c=0;c<=Tmax;++c){
                int cur = dp_tight0[c];
                if(!cur) continue;
                int sum = c + v;
                int bit = sum & 1;
                int nc = sum >> 1;
                // tight=0 stays 0
                ndp0[nc] = (ndp0[nc] + (int64)cur * ways) % MOD;
            }
            // handle tight=1
            for(int c=0;c<=Tmax;++c){
                int cur = dp_tight1[c];
                if(!cur) continue;
                int sum = c + v;
                int bit = sum & 1;
                if(bit > Sbit) continue;
                int nc = sum >> 1;
                int ntight = (bit == Sbit) ? 1 : 0;
                if(ntight) ndp1[nc] = (ndp1[nc] + (int64)cur * ways) % MOD;
                else ndp0[nc] = (ndp0[nc] + (int64)cur * ways) % MOD;
            }
        }else{
            // xbit == 0 => v can be 0..Tmax with multiplicity cnt[v]
            // iterate possible v where cnt[v]>0
            for(int v : vals){
                int ways = cnt[v];
                // tight=0 transitions
                for(int c=0;c<=Tmax;++c){
                    int cur = dp_tight0[c];
                    if(!cur) continue;
                    int sum = c + v;
                    int nc = sum >> 1;
                    ndp0[nc] = (ndp0[nc] + (int64)cur * ways) % MOD;
                }
                // tight=1 transitions
                for(int c=0;c<=Tmax;++c){
                    int cur = dp_tight1[c];
                    if(!cur) continue;
                    int sum = c + v;
                    int bit = sum & 1;
                    if(bit > Sbit) continue;
                    int nc = sum >> 1;
                    int ntight = (bit == Sbit) ? 1 : 0;
                    if(ntight) ndp1[nc] = (ndp1[nc] + (int64)cur * ways) % MOD;
                    else ndp0[nc] = (ndp0[nc] + (int64)cur * ways) % MOD;
                }
            }
        }
        dp_tight0.swap(ndp0);
        dp_tight1.swap(ndp1);
    }
 
    // After processing all bits, valid only if carry == 0
    int ans = dp_tight0[0];
    ans = addmod(ans, dp_tight1[0]);
    cout << ans << "\n";
    return 0;
}