#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = 1000000007; // 行列の積 template vector > matrixProduct(const vector >& x, const vector >& y) { int a = x.size(); int b = x[0].size(); int c = y[0].size(); vector > z(a, vector(c, 0)); for(int i=0; i vector > matrixPower(const vector >& x, int k) { int n = x.size(); vector > y(n, vector(n, 0)); for(int i=0; i > z = x; while(k > 0){ if(k & 1) y = matrixProduct(y, z); z = matrixProduct(z, z); k >>= 1; } return y; } long long solve(long long b, long long d, long long cnt, long long weight, long long& n) { if(cnt > n) return 0; long long ans = solve(b + 1, d, cnt * (d + 1) + d, weight * (d + 1) + b * d, n); long long x = n / (cnt + 1); n -= (cnt + 1) * x; ans += (weight + b) * x; ans %= MOD; return ans; } int main() { int n, b, d; cin >> n >> b >> d; vector > mat = { {d+1, d, 0}, {0, 1, 1}, {0, 0, 1} }; mat = matrixPower(mat, b); long long ans = mat[0][1] + mat[0][2]; ans %= MOD; long long tmp = n; ans += MOD - solve(1, d, 0, 0, tmp); ans %= MOD; cout << ans << endl; return 0; }