#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;
}