using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { var n = NN; var c = NList; var (b, d) = (c[0], c[1]); var ans = V(b, d); var len = new long[31]; len[1] = d; var size = new long[31]; size[1] = d; for (var i = 2; i < 31; ++i) { len[i] = len[i - 1] * (d + 1) + d; size[i] = (size[i - 1] * (d + 1) + (long)d * i) % mod; if (n <= len[i]) { var rest = (long)n; for (var j = i; j > 0; --j) { if (rest == 0) break; if (len[j] == n) { rest = 0; ans = (ans - size[j] + mod) % mod; } else { var ok = 0; var ng = d + 1; while (ng - ok > 1) { var mid = (ok + ng) / 2; if ((len[j - 1] + 1) * mid <= rest) ok = mid; else ng = mid; } rest -= (len[j - 1] + 1) * ok; ans = (ans - (size[j - 1] + j) * ok % mod + mod) % mod; } } WriteLine(ans); return; } } } static int mod = 1_000_000_007; static long V(int b, int d) { return (Exp(d + 1, 2) * (Exp(d + 1, b - 1) - 1 + mod) % mod * Exp(d, mod - 2) % mod + d - b + 1 + mod) % mod; } static long Exp(long n, long p) { long _n = n % mod; var _p = p; var result = 1L; if ((_p & 1) == 1) result *= _n; while (_p > 0) { _n = _n * _n % mod; _p >>= 1; if ((_p & 1) == 1) result = result * _n % mod; } return result; } }