1+ // https://codeforces.com/gym/104505/problem/A
2+ #include < bits/stdc++.h>
3+ using namespace std ;
4+
5+ #define forn (i,n ) for (int i=0 ; i<n; ++i)
6+ #define for1 (i,n ) for (int i=1 ; i<=n; ++i)
7+ #define fore (i,l,r ) for (int i=l; i<=r; ++i)
8+ #define fored (i,l,r ) for (int i=r; i>=l; --i)
9+ #define el ' \n '
10+ #define sz (v ) int (v.size())
11+
12+ typedef long long ll;
13+ const int mod = 1e9 + 7 ;
14+ template <class T >
15+ T bpow (T b, int e) {
16+ T a (1 );
17+ do {
18+ if (e & 1 ) a *= b;
19+ b *= b;
20+ }while (e >>= 1 );
21+ return a;
22+ }
23+ struct mint {
24+ int x;
25+ mint (): x(0 ){}
26+ mint (ll v) : x((v % mod + mod) % mod) {} // be careful of negative numbers!
27+ // Helpers to shorten code
28+ #define add (a, b ) a + b >= mod ? a + b - mod : a + b
29+ #define sub (a, b ) a < b ? a + mod - b : a - b
30+ #define yo *this
31+ #define cmint const mint&
32+
33+ mint &operator += (cmint o) { return x = add (x, o.x ), yo; }
34+ mint &operator -= (cmint o) { return x = sub (x, o.x ), yo; }
35+ mint &operator *= (cmint o) { return x = ll (x) * o.x % mod, yo; }
36+ mint &operator /= (cmint o) { return yo *= bpow (o, mod-2 ); }
37+
38+ mint operator + (cmint b) const { return mint (yo) += b; }
39+ mint operator - (cmint b) const { return mint (yo) -= b; }
40+ mint operator * (cmint b) const { return mint (yo) *= b; }
41+ mint operator / (cmint b) const { return mint (yo) /= b; }
42+
43+ mint operator - () const { return mint () - mint (yo); }
44+ bool operator == (cmint b) const { return x == b.x ; }
45+ bool operator != (cmint b) const { return x != b.x ; }
46+
47+ friend ostream& operator << (ostream &os, cmint p) { return os << p.x ; }
48+ friend istream& operator >> (istream &is, mint &p) { return is >> p.x ; }
49+ };
50+
51+ const int N = 1e6 ;
52+ mint f[N], fr[N];
53+ void initC (){
54+ if (f[0 ] == 1 ) return ; // Already precalculated
55+ f[0 ] = 1 ;
56+ for1 (i, N-1 ) f[i] = f[i-1 ] * i;
57+ fr[N-1 ] = bpow (f[N-1 ], mod-2 );
58+ fored (i, 1 , N-1 ) fr[i-1 ] = fr[i] * i;
59+ }
60+ struct LagrangePol {
61+ int n;
62+ vector<mint> y, den, l, r;
63+ LagrangePol (vector<mint> f): n(sz(f)), y(f), den(n), l(n), r(n){// f[i] := f(i)
64+ // Calcula interpol. pol P in O(n) := deg(P) = sz(v)-1
65+ initC ();
66+ forn (i, n) {
67+ den[i] = fr[n-1 -i] * fr[i];
68+ if ((n-1 -i) & 1 ) den[i] = -den[i];
69+ }
70+ }
71+ mint eval (mint x){ // Evaluate LagrangePoly P(x) in O(n)
72+ l[0 ] = r[n-1 ] = 1 ;
73+ for1 (i, n-1 ) l[i] = l[i-1 ] * (x - i + 1 );
74+ fored (i, 0 , n-2 ) r[i] = r[i+1 ] * (x - i - 1 );
75+ mint ans = 0 ;
76+ forn (i, n) ans += l[i] * r[i] * y[i] * den[i];
77+ return ans;
78+ }
79+ };
80+
81+ int main () {
82+ ios_base::sync_with_stdio (0 ); cin.tie (0 );
83+ mint n; int k;
84+ cin >> n >> k;
85+ vector<mint> num (2 *k + 10 );
86+ auto den = num;
87+ for1 (i, sz (num)-1 ) {
88+ num[i] = num[i-1 ] + bpow (mint (i), k) * bpow (n-i+1 , k);
89+ den[i] = den[i-1 ] + bpow (n-i+1 , k);
90+ }
91+ LagrangePol p_num (num), p_den (den);
92+ cout << p_num.eval (n) / p_den.eval (n) << el;
93+ }
0 commit comments