#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N =35;
const int mod = 1e9 + 7;
int L, m, k;
ll n;
bool v[N];
struct sq{
int a[N][N];
sq() { memset(a, 0, sizeof(a)); }
sq operator * (const sq &b) const
{
int i, j, k;
sq c;
for (i = 0; i <= L; i++)
for (j = 0; j <= L; j++)
for (k = 0; k <= L; k++)
c.a[i][j] = (1LL * a[i][k] * b.a[k][j] % mod + c.a[i][j]) % mod;
return c;
}
};
sq A, an;
void dfs(int x, int nw, int da)
{
if (!(x ^ m))
{
v[da] = 1;
int ne = da >> 1;
A.a[ne][da] = 1;
if (nw ^ k || da & 1)
A.a[ne | (1 << (m - 1))][da] = 1;
return;
}
dfs(x + 1, nw, da);
if (nw < k)
dfs(x + 1, nw + 1, da | (1 << x));
}
void ksm()
{
an = A;
if (!n)
return;
for (n--; n; n >>= 1, A = A * A)
if (n & 1)
an = an * A;
}
int main()
{
int i, s = 0;
scanf("%lld%d%d", &n, &m, &k);
L = (1 << m) - 1;
dfs(0, 0, 0);
ksm();
for (i = 0; i <= L; i++)
if (v[i])
s = (1LL * s + an.a[i][i]) % mod;
printf("%d", s);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:52:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld%d%d", &n, &m, &k);
^